文章目录
- iOS - Runloop的运行逻辑
- 1. 苹果官方的Runloop执行图
- 2. Mode里面的东西
- 2.1 Source0
- 2.2 Source1
- 2.3 Timers
- 2.4 Observers
- 3. 执行流程
- 3.1 注意点
- 4. Runloop休眠
iOS - Runloop的运行逻辑
1. 苹果官方的Runloop执行图
2. Mode里面的东西
2.1 Source0
- 触摸事件处理
- performSelector:onThread:
2.2 Source1
- 基于Port的线程间通信
- 系统事件捕捉
系统事件捕捉:从用户点击屏幕到应用处理触摸事件,先是由Source1捕捉
屏幕点击事件(系统事件),然后再包装成Source0处理
触摸事件
2.3 Timers
- NSTimer
- performSelector:withObject:afterDelay:
2.4 Observers
- 用于监听RunLoop的状态
- UI刷新(BeforeWaiting)
- Autorelease pool(BeforeWaiting)
UI刷新
和Autorelease pool清理自动释放对象
,都是在Runloop
即将进入睡眠状态时触发(kCFRunLoopBeforeWaiting)
3. 执行流程
- 通知Observers:进入Loop
- 通知Observers:即将处理Timers
- 通知Observers:即将处理Sources
- 处理Blocks
- 处理Source0(可能会再次处理Blocks)
- 如果存在Source1,就跳转到第8步
- 通知Observers:开始休眠(等待消息唤醒)
- 通知Observers:结束休眠(被某个消息唤醒)
-
- 处理Timer
-
- 处理GCD Async To Main Queue
-
- 处理Source1
- 处理Blocks
- 根据前面的执行结果,决定如何操作
-
- 回到第02步
-
- 退出Loop
- 通知Observers:退出Loop
3.1 注意点
GCD
很多东西不依赖
于Runloop,它们是分开
的。但是GCD
从子线程
回到主线程
的时候,是依赖于
Runloop的
dispatch_async(dispatch_get_main_queue(), ^{NSLog(@"");
});
4. Runloop休眠
Runloop休眠,是通过系统内核API
,不同于while循环那种,而是真正地进入休眠状态
@oubijiexi