NSRunLoop的理解

来源:互联网 发布:python 定义字典 编辑:程序博客网 时间:2024/05/17 23:44

iOS的应用程序里面,程序启动后会有一个 main thread 开始执行 main() -> UIApplicationMain() 函数,然后为这个 main thread 设置了一个 NSRunLoop 对象,每个线程只可以关联一个 NSRunLoop 对象的,具体怎么关联的目前还不清楚,可以认为 NSThread 和 NSRunLoop 是一对一的关系。
我个人理解的NSRunLoop就是:可以给 NSRunLoop 设置一堆的 Input Sources 和 Observers,它们之间通过一个叫 “Run Loop Mode”的东西关联起来,实际上就是一个 NSString 而已, 对于 main thead 的 RunLoop, 就开始不断的的轮询每一个 input source,看看有没有 event 发生,如果有event,就给相关的observer 发送 notification, 给observer去处理event, 例如当发生的 touch event 的时候。

 

什么时候使用runloop?

只有在你创建了第二个thread时你才需要显式的运行run loop。对于main thread的run loop是作为框架的一部分。所以Cocoa和Carbon框架提供自动运行应用程序主循环的代码。IOS中UIApplication的run方法用于启动应用程序主循环并作为启动序列的一部分。如果你是使用Xcode template生成应用程序,则不需要对run方法进行显式的调用。

对于第二个thread,你需要决定是否有必要使用run loop,如果需要,则需要你手工进行配置和启动。你并不需要为每个新建的thread都建立run loop。例如:如果你使用你的thread运行一些长时间运行且可预知结果的任务,你就可以不启动该thread的run loop。Run loop所要解决的问题是你需要与该thread有很多的交互。

如遇到以下的情况,则你就需要启动thread内的run loop:

使用ports或自定义的input sources与其它thread进行交互;

在thread中使用Timers(定时器);

在Cocoa应用中使用任意performSelector...方法;

需要使用thread完成周期性的任务。

如果你决定使用run loop,则配置和运行将很直接。就像所有的多thread编程,你将考虑你新建thread的中止条件。总是将新建的thread安全退出好过强制退出。

原创粉丝点击