1. 概念
- RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象
- 事件循环
-
没有消息需要处理时,休眠以避免资源占用
-
有消息需要处理时,立刻被唤醒
-
2. 数据结构
- CFRunLoop
- CoreFoundation 框架
- 开源
- CFRunLoop
- pthread —— 与线程一一对应
- currentMode —— CFRunLoopMode
- modes —— NSMutableSet<CFRunLoopMode*>
- currentModes —— NSMutableSet<NSString*>
- currentModeItems —— 由多个Source/Timer/Observer组成的集合
- CFRunLoopMode
- name
- NSDefaultRunLoopMode等
- sources0
- MutableSet
- 需要手动唤醒线程
- sources1
- MutableSet
- 具备唤醒线程的能力
- obverses
- MutableArray
- timers
- MutableArray
- name
- Source
- Timer
- CFRunLoopTimer —— 和NSTimer是toll-free bridged的
- Observer
- CFRunLoopObeserver
- 观测时间点
- kCFRunLoopEntry
- kCFRunLoopBeforeTimers
- kCFRunLoopBeforeSources
- kCFRunLoopBeforeWaiting —— 即将从用户态切换到内核态
- kCFRunLoopAfterWaiting —— 从内核态切换到了用户态
- kCFRunLoopExit
-
对应关系
- NSRunLoop
- Foundation框架
- 是对CFRunLoop的封装,提供了面向对象的API
- CommonMode
- NSRunLoopCommonModes
- CommonMode不是实际存在的
- 是同步Source/Timer/Observer到多个Mode中的一种技术方案
3. 事件循环机制
4. RunLoop与NSTimer
-
列表滑动时timer的工作
5. RunLoop与多线程
- 关系
- 线程和RunLoop是一一对应的
- 线程默认是没有RunLoop的,第一次获取时创建
- 实现常驻线程
- 为当前线程开启一个RunLoop
- 向RunLoop中添加一个Port/Source等维持RunLoop的事件循环
- 启动RunLoop