有关RunLoop
2019-03-28 本文已影响0人
TAsama
1. 什么是RunLoop?
RunLoop是通过内部维护的事件循环来对事件/消息进行管理的一个对象
- 没有消息需要处理的时候, 休眠以避免资源占用
- 有消息需要处理时, 立刻被唤醒
没有消息需要被处理时, 系统会将当前线程所有权转化为内核态, 当有消息需要处理时, 系统会将当前线程的状态切换回用户态
所以RunLoop的循环并不是一个单纯的死循环, 而是通过状态切换, 达到没有消息是休眠, 有消息时唤醒的这样一个事件循环机制.
RunLoop的数据结构
NSRunLoop是CFRunLoop的封装, 提供了面向对象的API
- CFRunLoop
- CFRunLoopMode
- Source/Timer/Observer
CFRunLoop
CFRunLoop的数据结构
CFRunLoopMode的数据结构
CFRunLoopObserver
观测时间点
- kCFRunLoopEntry
- kCFRunLoopBefore Timers
- kCFRunLoopBeforeSources
- kCFRunLoopBeforeWaiting
- kCFRunLoopAfterWaiting
各个数据结构之间的关系
RunLoop中各个数据结构之间的关系
可以看到, 一个RunLoop可以有多个Model, 而每个Model中又可以存放多个不同的事件, 我们在切换Model时, 其他Model的事件将不会被响应.
CommonMode的特殊性
NSRunLoopCommonModes
- CommonMode不是实际存在的一种Mode
-
是同步Source/Timer/Observer到多个Mode中的一种技术方案
事件循环的实现机制
RunLoop与多线程
- 一个线程对应一个RunLoop
- 线程默认是没有RunLoop的
- 常驻线程的实现