前言
在苹果官方文档中对Run Loops
的介绍是:
Run Loops 是与线程相关的基础结构的一部分;
Run Loop 是一个用于调度工作和协调事件接受的事件处理循环;
Run Loop的目的是在有工作时当线程保持忙碌,没有工作时让线程休眠。
RunLoop
是事件循环机制在iOS
中的一种实现方式。
正文
RunLoop
的应用范畴
- 保证程序不会退出
- 定时器(
Timer
)、NSObject
的performSelector
方法执行 -
GCD
的Async Main Queue
事件回调 - 事件响应、手势识别、界面刷新等
UI
事件 - 网络请求
-
AutoreleasePool
管理
RunLoop
的获取方法
在Foundation
框架中
[NSRunLoop currentRunLoop]; // 获取当前线程的RunLoop,如果不存在则创建
[NSRunLoop mainRunLoop]; // 获取主线程的RunLoop
在Core Foundation
框架中
CFRunLoopGetCurrent(); // 获取当前线程的RunLoop,如果不存在则创建
CFRunLoopGetMain(); // 获取主线程的RunLoop
NSRunLoop
是 CFRunLoopRef
的 OC
包装。并且 CFRunLoopRef
是开源的。
通过阅读Core Foundation源码,我们可以得到如下结论:
-
Runloop
与线程密切相关,每条线程都有唯一的一个与之对应的Runloop
对象; -
Runloop
保存在一个全局的字典里,线程作为key,Runloop 作为value ; - 线程刚创建时并没有
Runloop
对象,Runloop
会在第一次获取它时创建,Runloop 会在线程结束时销毁; - 主线程的
Runloop
已经自动创建,子线程默认没有开启Runloop
。
网友评论