故事
RunLoop ,运行时循环。
iOS App 启动之后,当前进程开启主线程之后,为了保证主线程一直在运行就在主线程中开启了 RunLoop。RunLoop 在运行过程中,如果有事件(比如 timer、Source、Observe)就会进行处理,如果没有事件就会在一种休眠状态。
在真正了解 RunLoop 之前,估计我就只能说出上面这一串解释说明了,如果再继续说的话,就应该是响应者链了。但是,经过最近一段时间学习发现 RunLoop 真是无处不在,只不过我们没有注意吧了。
比如:
- Timer 的运行与 RunLoop 有关,主要是 mode 方面;
- GCD 的 dispatch_get_mainQueue 也与 RunLoop 有关系,毕竟都是在主线程中的事情;
- ScrollView/TextView 的滑动业余 RunLoop 有关,主要是模式之间的切换;
- 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。