runloop原理介绍

原文:http://lianxu.me/2012/11/10-cocoa-objc-newbie-problems/c++

http://blog.csdn.net/dongdongdongjl/article/details/7794050程序员

 

thread和runloop在之前,开发者根本不太当成一个问题。由于没有静态语言里runloop就是固定的线程执行loop。而如今Cocoa新手搞不明白的太多了,由于没有从动态角度看它,首先回想一下第2点介绍的runtime概念,接着出一个思考题。设计模式

如今有一个程序片断以下:xcode

 

 

如今要求,作某些设计,使得当这个线程运行的同时,还能够从其它线程里往它里面随意增长去掉不一样的计算任务。 这,就是NSRunloop的最原始的开发初衷。让一个线程的计算任务更加灵活。 这个功能在c, c++里也许能够作到可是很是难,最主要的是由于语言能力的限制,之前的程序员不多这么去思考。安全

好,如今咱们对上面代码作一个很是简单的进化:函数

 

 

注意,这里没有作线程安全处理,记住Mutable container is not thread safe. 这个简单的扩展,让咱们看到了如何利用runtime能力让线程灵活起来。当咱们从另外线程向targetQueue和actionQueue同时加入对象和方法时候,这个线程函数就有了执行一个额外代码的能力。oop

有人会问,哪里有runloop? 那个是nsrunloop? 看不出来啊。spa

 

 

这个结构就叫线程的runloop, 它和NSRunloop这个类虽然名字很像,但彻底不是一个东西。之前在使用静态语言开始时候,程序员没有什么迷惑,由于没有NSRunloop这个东西。 我接着来讲,这个NSRunloop是如何来得。.net

第二段扩展代码里面确实没有NSRunloop这个玩意儿,咱们接着作第3次改进。 此次咱们的目的是把其中动态部分抽象出来。线程

 

 

走到这里,咱们就算是基本把Runloop结构抽象出来了。例如我有一个MyNSThread实例,myThread1。我能够给这个实例的线程添加须要的任务,而myThread1内部的MyNSRunloop对象会管理好这些任务。

 

 

当你看懂了上面的代码也许会感叹,‘原来是这么回事啊!为何把这么简单的功能搞这么复杂呢?’ 其实就是这么回事,把Runloop抽象出来能够使得线程任务管理更加loose coupling,给设计模式提供更大的空间。这样第三方开发者不须要过深刻的涉及线程内部代码而轻松管理线程任务。另外请注意,这里MyNSRunloop, MyNSTimer等类是我写得一个模拟状况,真实的NSRunloop实现确定不是这么简单。这里为了说明一个思想。这种思想贯穿整个cocoa framework,从界面更新到event管理。

 

仅当在为你的程序建立辅助线程的时候,你才须要显式运行一个 run loop。Run loop 是程序主线程基础设施的关键部分。因此,Cocoa 和 Carbon 程序提供了代码运 行主程序的循环并自动启动 run loop。IOS 程序中 UIApplication 的 run 方法(或 Mac OS X 中的 NSApplication)做为程序启动步骤的一部分,它在程序正常启动的时 候就会启动程序的主循环。相似的,RunApplicationEventLoop 函数为 Carbon 程序 启动主循环。若是你使用 xcode 提供的模板建立你的程序,那你永远不须要本身去显 式的调用这些例程。

对于辅助线程,你须要判断一个 run loop 是不是必须的。若是是必须的,那么 你要本身配置并启动它。你不须要在任何状况下都去启动一个线程的 run loop。比 如,你使用线程来处理一个预先定义的长时间运行的任务时,你应该避免启动 run loop。Run loop 在你要和线程有更多的交互时才须要,好比如下状况:

 使用端口或自定义输入源来和其余线程通讯  使用线程的定时器  Cocoa 中使用任何 performSelector...的方法 使线程周期性工做

相关文章
相关标签/搜索