RunLoop相关

2020-08-13  本文已影响0人  萝卜丝巾


引文:


  1. 概念

  2. 数据结构

  3. 事件循环

  4. Runloop与NSTimer

  5. Runloop与多线程


概念:

runloop 是由系统内部维护的事件循环对消息/事件进行管理的对象

没有消息需要处理时,系统进入休眠状态,节约资源.

用户态 --> 内核态

如果有消息需要处理,会被立即唤醒 (手动唤醒/NSTimer/Source1)

内核态 --> 用户态
image.png
image.png
数据结构

NSRunLoop是对CFRunLoop的封装,提供了面向对象的api.
CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。

CFRunLoop

image.png

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

image.png
CommonMode 的特殊性

NSRunLoopCommonModes


事件循环机制:
image.png
RunLoop和NSTimer

滑动tableview的时候定时器还会生效吗?
当滑动tableview的时候定时器会从kCFRunLoopDefaultMode 切换到UITrackingRunLoopMode


怎么实现一个常驻线程
为当前线程开始runloop
向该runloop中添加port/Source维护runloop的事件循环\
启动该runloop
上一篇 下一篇

猜你喜欢

热点阅读