RunLoop相关



引文:
  • 多线程相关
  • OC 语言相关
  • 内存管理相关
  • UI视图相关
  • RunLoop相关


  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

  • CFRunLoopMode

  • Source/Timer/Observer

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

  • CommonMode不是实际存在的一种Mode.

  • 是同步Source/Timer/Observer到多个Mode中的一种技术方案


事件循环机制:
image.png

RunLoop和NSTimer

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


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

你可能感兴趣的:(RunLoop相关)