Run loops 的具体执行顺序(ios oc)

来源:互联网 发布:javac 运行java文件 编辑:程序博客网 时间:2024/05/17 01:10

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...的方法;

使线程周期性工作。


0 0
原创粉丝点击