NSRunloop
来源:互联网 发布:淘宝送的优酷会员在哪 编辑:程序博客网 时间:2024/05/21 09:29
http://blog.sina.com.cn/s/blog_7f7a975b0101arqi.html
关于NSRunLoop,其实有很多的内容可写,时间有限,简要罗列几个要点:
BOOL shouldKeepRunning = YES; // globalNSRunLoop *theRL = [NSRunLoop currentRunLoop];while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDatedistantFuture]]);1.
函数runMode:beforeDate:在没有inputsource或者timer的时候会block,类似于poll和select掉用,处于wait(semaphore)
状态。2.函数runMode:beforeDate:
会在处理完毕observer过程或者beforeDate时间到的时候返回,当beforeDate时间小于observer过程处理时间时,observer过程处理完后就也返回了。如果没有inputsource,等待beforeDate后返回。3.同一个线程中最好避免出现以上循环超过2次。4.新建一个NSThread不会自动创建Run Loop循环(注意是Run Loop循环,runloop本身是自动创建的,而不是循环,这个循环其实就是消息队列循环),这时候需要我们手动创建一个runloop循环,apple说明文档上有:if no input sources or timers are attached to the run loop, this method exits immediately and returns NO
;所以我们还需要添加一个source or timer到这个runloop中。5.runloop能很好处理多个inputsource,类似cpu时间片一样的在这些source中轮询。比如有多个http链接要同时下载内容,那么新开一个线程把connections全部放到这个线程的runloop中就可以了(或者直接放在MainThread的runloop中),千万不要多开线程。6.[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow :0.5]];把timeout设置较短会消耗大量的CPU,不提倡,除非有特殊情况。
首先是Run Loop的部分概念,它的作用就是循环、处理事件。具体来说有两个方面: 1. 定时启动任务(一般用和Timer协作);2. 处理事件。
在单线程的app中,不需要注意Run Loop,但不代表没有。程序启动时,系统已经在主线程中加入了Run Loop。它保证了我们的主线程在运行起来后,就处于一种“等待”的状态(而不像一些命令行程序一样运行一次就结束了),这个时候如果有接收到的事件(Timer的定时到了或是其他线程的消息),就会执行任务,否则就处于休眠状态。
如果我们要写多线程的程序,可能就需要自己来管理Run Loop。
下面说一下楼主提出的方法中的参数:
RunMode: NSDefaultRunLoopMode,可以把这个理解为一个”过滤器“,我们可以只对自己关心的事件进行监视。一般NSDefaultRunLoopMode是最常用的。
启动run loop的方法就是lz写的这个,它的说明如下:
Runs the loop once, blocking for input in the specified mode until a given date.
启动run loop一次,在特定的run loop mode下等待输入。
如果没有附加input source或是timer,或是过limitDate,run loop就会退出,并且方法返回NO。
下来是Run Loop的使用场合:
1. 使用port或是自定义的input source来和其他线程进行通信
2. 在线程(非主线程)中使用timer
3. 使用 performSelector...系列(如performSelectorOnThread, ...)
4. 使用线程执行周期性工作
run loop不需要创建,在线程中只需要调用[NSRunLoop currentRunLoop]就可以得到
假设我们想要等待某个异步方法的回调。比如connection。如果我们的线程中没有启动run loop,是不会有效果的(因为线程已经运行完毕,正常退出了)。我们可以用一个条件来运行run loop
BOOL done = NO;
do
{
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]
}
while(!done);
这样就可以一直进行等待,直到在别的位置将done置为YES,表示任务完成。
大家可以在子线程里去添加一个timer,或是调用NSURLConnection,就明白用法了。
- NSRunLoop
- nsrunloop
- NSRunloop
- nsrunloop
- NSRunLoop
- NSRunloop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunLoop
- NSRunloop
- NSRunLoop
- java下载图片到本地
- Scrum
- inet_ntop(), inet_pton()
- java对象的克隆
- 黑马程序员-----枚举
- NSRunloop
- unity3d 游戏对象消失三种方法的区别(enabled/Destroy/active)
- 关于分别import导入每个文件和*操作哪个更有效率
- Linux & C记录
- 我在学python
- javascript中对数组的操作
- extjs combobox下拉框显示位置问题
- spring 事务详解
- Chrome 最小字体12px