RunLoop(一)

故事

RunLoop ,运行时循环。

iOS App 启动之后,当前进程开启主线程之后,为了保证主线程一直在运行就在主线程中开启了 RunLoop。RunLoop 在运行过程中,如果有事件(比如 timer、Source、Observe)就会进行处理,如果没有事件就会在一种休眠状态。

在真正了解 RunLoop 之前,估计我就只能说出上面这一串解释说明了,如果再继续说的话,就应该是响应者链了。但是,经过最近一段时间学习发现 RunLoop 真是无处不在,只不过我们没有注意吧了。

比如:

  1. Timer 的运行与 RunLoop 有关,主要是 mode 方面;
  2. GCD 的 dispatch_get_mainQueue 也与 RunLoop 有关系,毕竟都是在主线程中的事情;
  3. ScrollView/TextView 的滑动业余 RunLoop 有关,主要是模式之间的切换;
  4. App 的卡顿与 RunLoop 也有关,这个我倒是还不知道什么事情

真心发现 RunLoop 是一个很大的模块,之前一直忽略了,这次抽时间好好的细致的了解一下 RunLoop 中的知识。

RunLoop API

RunLoop 的 API 有两套,一套是 OC 的,名字是 NSRunLoop; 另一套是 C 语言的 CFRunLoop。 后者是开源的

针对于 NSRunLoop,可以看一下文档介绍,大体意思为:
NSRunLoop 是编程接口,这套编程接口主要用来处理输源。
一个 NSRunLoop 对象负责处理键盘、鼠标、NSPort、NSConnection 以及 NSTimer 事件。你的应用开发中不能直接创建和管理 NSRunLoop。每一个 NSThread 对象,包括 mainThread 都包含了一个 NSRunLoop 对象,这个对象根据需要自动创建。如果你想要查看当前的 RunLoop 对象,可以通过 currentRunLoop 获取。

需要注意的是:
NSRunLoop 不是线程安全的,所以不要在多线程中使用 NSRunLoop。

-------------本文结束谢谢欣赏-------------
Alice wechat