引文:
-
概念
-
数据结构
-
事件循环
-
Runloop与NSTimer
-
Runloop与多线程
概念:
runloop
是由系统内部维护的事件循环对消息/事件进行管理的对象
没有消息需要处理时,系统进入休眠状态,节约资源.
用户态 --> 内核态
如果有消息需要处理,会被立即唤醒 (手动唤醒/NSTimer/Source1
)
内核态 --> 用户态
数据结构
NSRunLoop
是对CFRunLoop
的封装,提供了面向对象的api.
CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。
CFRunLoop
CFRunLoopMode
Source/Timer/Observer
CFRunLoop
CFRunLoopTimer
是基于时间的触发器,它和 NSTimer 是toll-free bridged 的,可以混用。其包含一个时间长度和一个回调(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。
CFRunLoopObserver
观测时间点
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理 Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7), // 即将退出Loop
};
一个RunLoop对象可以对应多个Model, 每个Model 又有多个source/timer/observer
CommonMode 的特殊性
NSRunLoopCommonModes
CommonMode不是实际存在的一种Mode.
是同步Source/Timer/Observer到多个Mode中的一种技术方案
事件循环机制:
RunLoop和NSTimer
滑动tableview的时候定时器还会生效吗?
当滑动tableview的时候定时器会从kCFRunLoopDefaultMode 切换到UITrackingRunLoopMode
怎么实现一个常驻线程
为当前线程开始runloop
向该runloop中添加port/Source维护runloop的事件循环\
启动该runloop