探索 Run Loop

  

说到RunLoop,无论从项目代码或者网上都会有以下这段代码:

while (!_isFinish)

{

NSRunLoop *runloop = [NSRunLoop currentRunLoop];

[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

}

究竟[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]干啥的?

本文本最重要的是要说明白这个事情!准备好开始了.

对于single view application的应用程序,UIApplicationMain()方法在这里不仅完成了初始化我们的程序并设置程序Delegate的任务,而且随之开启了主线程的Run Loop, 开始接受处理事件。

  从简单开始,通过监听runloop状态,查看进入程序什么都不干,runloop会干点啥。

  监听代码如下:

  
  

  

  

runLoopActivityStringWithActivity函数只是简单的把值转换成对应的文本方便查看。

打印结果如下:

  

log出来CFRunLoopActivity对应着别人简化runloop源码逻辑看,本文其它log也可

以对着看。
  

可知道:程序在经过了一系列变化后进入了休眠状态。

然后在viewController里加入个按钮button one,响应代码如下:

  

点击后打印结果:

主线程被换醒,然后处理按钮事件,接着过了一阵子就会从新进入休眠,等待下一事件。

继续往下,我又加了一个button two。并把代码修改成如下,大家都知道,点击了
button one 后就进入了死循环,点击button two 是不起作用的。这里就不上Log了。

但是把button one 代码改成下面这样,就算button one代码没有执行完,同样可以
在主线程响应button two的事件。究竟

[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];

做了什么事情呢?

此时打印出来的log如下:

从log中看到并没有打印出one button End.说明one button 还没有执行完。

但是我们可以看到one button before和after RunLoop被打印了好几次,并且CFRunLoopActivity

打印出来好几次1和128.说明RunLoop是有退出和重新进入的。不是说主线程的runLoop不会退出的吗?

难道打出来的不是主线程的runLoop?下面就慢慢说明白这些东西

为了方便理解,我会把启动时应用给我们创建的RunLoop叫做RunLoop对象,它会一直循环着简化

runloop源码的逻辑。可以这样说RunLoop对象创建了一个循环,这个循环可以在有事件发生里处理
事件,没事发生就会休眠,等待事件发生。那为什么开始没改代码时那种情况为什么响应不了button two的事件呢,那是因为处理button one事件没还返回,系统给我们创建的这个循环并不能往下走了所以处理不了button two。而修改代码后,[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]其实是为RunLoop对象创建了个新的循环。一次循环只会打有一个kCFRunLoopEntry和kCFRunLoopExit,中间的CFRunLoopActivity状态则要看情况而定,如有哪个输入源等。到达kCFRunLoopExit表明这个循环要退出。由于while中一直为true,循环会不停被启动。[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]创建的循环我叫它子循环,button two 事件其实是在这个子循环里被处理。所以RunLoop对象的循环可以有多个,并且是嵌套的。事件处理会被嵌套最深的那个子循环处理。为了证实这个说法继续加了个button three,并把button two 代码修改,代码如下

连续点击button one two there.在three中打个断点。调用栈如下:

很明显看到,button two的事件是在one中创建的子循环执行,而button three的事件是在two中创建的子

循环执行。

总结:

1、[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]其实是为线程创建

一个循环,如果线程已经有,创建的是一个子循环。

2、通过[runloop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]创建的循环过一段时间或

马上返回,这取决于输入源及系统的调度。所以用while进行不断驱动,不停创建循环。

3、我们看到日志打印出kCFRunLoopExit是子循环的exit.

时间: 2024-11-03 23:21:56

探索 Run Loop的相关文章

run loop

Objective-C之run loop详解 作者:wangzz 原文地址:http://blog.csdn.net/wzzvictory/article/details/9237973 转载请注明出处 如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号wangzzstrive来支持我,谢谢! 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出

iOS多线程开发(三)---Run Loop(四)

四,配置Run Loop源---配置源的过程就是源的创建调用过程 配置过程分为以下几个阶段---定义/创建(一个源)---安装(将输入源安装到所在Run Loop中)---注册(将输入源注册到客户端,协调输入源的客户端)---调用(通知输入源,开始工作) 4-1,定义自定义输入源 创建自定义输入源需要定义以下内容 1)输入源要处理的信息 2)使感兴趣的客户端知道如何和输入源交互的调度例程 3)处理其他任何客户发送请求的例程 4)使输入源失效的取消例程 Figure 3-2 Operating a

iOS多线程开发(三)---Run Loop(二,三)

二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop. 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何performSelector...的方法(参考Table:Performing selectors on other threads) 4)使线程周期性工作 三,如何使用Run Loop对象 Run Loop对象提供了添加输入源,定时器和Run Loop的观察者以及启动Run Loop的接口,使用Run

iOS 中 run loop 浅析

iOS 中 run loop 浅析 runloop 虽然是与线程想关的重要概念,但 cocoa 中的 runloop 终是用得不多,观相关博文却也未得入门其"why".所以浅习几日,得一粗陋分享浅文,作为笔记,写下其所以然.有不对或错误的地方,还望指教,不甚感激. run loop解惑 线程在执行完后,会被销毁.为了使线程能一直运行,咱们可以在线程里边弄个运行循环(run loop),让线程一直执行: - (void)myThread:(id)sender { while (TRUE)

解析在iPhone应用中NSThread创建Run Loop

在iPhone应用中NSThread创建Run Loop是本文要介绍的内容,虽然iphone为我们提供了很多简单易于操作的线程方法. IPhone多线程编程提议用NSOperation和NSOperationQueue,这个确实很好用. 但是有些情况下,我们还是在运行一些长线任务或者复杂任务的时候需要用比较原始的NSThread.这就需要为NSThread创建一个run loop. [pre]NSThread *thread1 = [[NSThread alloc] initWithTarget

ios - run loop (timer)

在ios开发多线程程序的时候,往往会碰到run loop. 对于run loop, 苹果开发网站上有非常详细的说明,https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html 强烈建议啃下来,不要怕英文. copy了一下图片: 这里就写个Timer sources的简单例子. 系统创建一个线程的时候,就已

Run Loop详解

Run loops是线程的基础架构部分.一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件.使用run loop的目的是使你的线程在有工作的时候工作,没有的时候休眠. Run loop的管理并不完全是自动的.你仍必须设计你的线程代码以在适当的时候启动run loop并正确响应输入事件.Cocoa和CoreFundation都提供了run loop对象方便配置和管理线程的run loop.你创建的程序不需要显示的创建run loop:每个线程,包括程序的主线程(main

run loop 输入源

做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出现各种怪异的问题时不至于不知所措.废话少说,进入今天的正题. 不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发的有任何动作发生,但是如果我们点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生.给我们的感觉就像应用一直处于随时

Objective-C之run loop详解

本文转载至 http://blog.csdn.net/ztp800201/article/details/9240913 做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出现各种怪异的问题时不至于不知所措.废话少说,进入今天的正题. 不知道大家有没有想过这个问题,一个应用开始运行以后放在那里,如果不对它进行任何操作,这个应用就像静止了一样,不会自发