iOS runloop 知识点总结

一: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。

你可能感兴趣的:(iOS runloop 知识点总结)