一:runloop相关知识
1. runloop是什么
runloop是通过内部维护的时间循环,来对事件/消息进行管理的对象
2. runloop特征
(1)没有消息处理时休眠,避免资源占用(用户态切换到内核态)
(2)有消息处理时立刻被唤醒(内核态切换到用户态)
3. runloop有哪几种mode
(1) NSDefaultRunLoopMode: 默认模式
(2) NSRunLoopCommonModes:mode集合
(3) UITrackingRunloopMode:跟踪用户交互事件
(4) UIInitializationRunloopMode:初始化模式,程序启动完后不再调用
(5) GSEventReceiveRunloopMode: 接受系统内部事件
4. runloop数据结构
① CFRunloop: runloop对象
由以下几个部分组成。
Pthred:线程,与runloop是一一对应的关系
commonModes: 字符串集合。一个字符串对应一种mode
commonmodelItems:observer/timer/source的统称
currentMode 当前mode
Modes 是runloopmode的无序集合
② CFRunloopMode: runloop运行模式
(由name,source0,source1,observer,timer 组成)
③ CFRunloopSource: 输入源/事件源
有两种:source0: 用户触发的事件
Source1: 系统发送的消息
④ CFRunloopTimer: 定时源
⑤ CFRunloopObserver:观察者 用户监听以下时间点
l kCFRunLoopEntry // 即将进入Loop
l kCFRunLoopBeforeTimers // 即将处理 Timer
l kCFRunLoopBeforeSources // 即将处理 Source
l kCFRunLoopBeforeWaiting // 即将进入休眠
l kCFRunLoopAfterWaiting // 刚从休眠中唤醒
l kCFRunLoopExit // 即将退出Loop
5. runloop各个数据结构之间的关系
(1)一个runloop对用多种mode,每个model下又有多种source。Observer,timer
(2)runloop启动时,只能指定一个mode,这个mode被称为currentMode
(3)如果需要切换mode,只能退出loop,再重新指定一个mode进入。
6. runloop实现机制
(1)、通知观察者 RunLoop 即将启动。
(2)、通知观察者即将要处理Timer事件。
(3)、通知观察者即将要处理source0事件。
(4)、处理source0事件。
(5)、如果基于端口的源(Source1)准备好并处于等待状态,进入步骤9。
(6)、通知观察者线程即将进入休眠状态。
(7)、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。
- 一个基于 port 的Source1 的事件(图里应该是source0)。
- 一个 Timer 到时间了。
- RunLoop 自身的超时时间到了。
- 被其他调用者手动唤醒。
(8)、通知观察者线程将被唤醒。
(9)、处理唤醒时收到的事件。
- 如果用户定义的定时器启动,处理定时器事件并重启RunLoop。进入步骤2。
- 如果输入源启动,传递相应的消息。
- 如果RunLoop被显示唤醒而且时间还没超时,重启RunLoop。进入步骤2
(10)、通知观察者RunLoop结束。
二:runloop与线程
1.runloop与线程是什么关系
(1)一一对应的关系,一个线程对应一个runloop。
(2)主线程默认开启runloop,子线程/自己创建的线程需要手动开启runloop。