Run loops 是线程相关的的基础框架的一部分。一个 run loop 就是一个事件处理 的循环,用来不停的调度工作以及处理输入事件。
使用 run loop的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
Runloop还可以在loop在循环中的同时响应其他输入源,比如界面控件的按钮,手势等。
Run loop 模式是所有要监视的输入源和定时源以及要通知的 run loop 注册观察 者的集合。
可以将 Run loop 观察者和以下事件关联:
Run loop 入口
Run loop 何时处理一个定时器
Run loop 何时处理一个输入源
Run loop 何时进入睡眠状态
Run loop 何时被唤醒,但在唤醒之前要处理的事件
Run loop 终止
每次运行 Run loop,你线程的 Run loop 对会自动处理之前未处理的消息,并通知相关的观察者。具体的顺序如下:
1. 通知观察者 Run loop 已经启动。
2. 通知观察者任何即将要开始的定时器。
3. 通知观察者任何即将启动的非基于端口的源。
4. 启动任何准备好的非基于端口的源。
5. 如果基于端口的源准备好并处于等待状态,立即启动;并进入步骤 9。
6. 通知观察者线程进入休眠。
7. 将线程置于休眠直到任一下面的事件发生:
某一事件到达基于端口的源;
定时器启动;
Run loop 设置的时间已经超时;
Run loop 被显式唤醒。
8. 通知观察者线程将被唤醒。
9. 处理未处理的事件
如果用户定义的定时器启动,处理定时器事件并重启 Run loop。进入步骤 2。
如果输入源启动,传递相应的消息。
如果 Run loop 被显式唤醒而且时间还没超时,重启 Run loop,进入步骤 2。
10. 通知观察者 Run loop 结束。
Run loop 在你要和线程有更多的交互时才需要,比如以下情况:
使用端口或自定义输入源来和其他线程通信;
使用线程的定时器;
Cocoa 中使用任何performSelector...的方法;
使线程周期性工作。