解密-神秘的RunLoop

转载 2016年06月02日 12:05:53
参考链接:http://www.jianshu.com/p/cf4915508929


RunLoop:

1:循环跑圈,其内部就是一个做了个do-while循环,在这个循环里不断的处理各种任务(比如source,timer、observer);

2:一个线程对应一个RunLoop,主线程的RunLoop默认已经启动,子线程的RunLoop需要手动启动(调用run)

3:在开发中如何用RunLoop应用场景:

开启一个常驻线程(让一个子线程不进入消亡状态,等待其他线程发过来消息,处理其他事件)

eg:1:在子线程中开启一个定时器

        2:在子线程中进行一些长期监控

4:可以控制定时器在特定模式下执行、让某些事件(行为、任务)在特定模式下执行、添加Observer监听RunLoop的状态,比如监听点击事件的处理(在所有的点击事件之前做些事情);

- (void)timer
{
    NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];
    // 定时器只运行在NSDefaultRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

    // 定时器只运行在UITrackingRunLoopMode下,一旦RunLoop进入其他模式,这个定时器就不会工作
    //    [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode];

    // 定时器会跑在标记为common modes的模式下
    // 标记为common modes的模式:UITrackingRunLoopMode和NSDefaultRunLoopMode兼容
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

- (void)timer2
{
    // 调用了scheduledTimer返回的定时器,已经自动被添加到当前runLoop中,而且是NSDefaultRunLoopMode
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES];

    // 修改模式
    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
}

4.常驻线程 (重要)

应用场景:经常在后台进行耗时操作,如:监控联网状态,扫描沙盒等 不希望线程处理完事件就销毁,保持常驻状态

第一种(推荐)
开启
  - (void)run
{
  //addPort:添加端口(就是source)  forMode:设置模式
   [[NSRunLoop currentRunLoop] addPort:[NSPort port] forMode:NSDefaultRunLoopMode];
  //启动RunLoop
    [[NSRunLoop currentRunLoop] run];

 /*
  //另外两种启动方式
    [NSDate distantFuture]:遥远的未来  这种写法跟上面的run是一个意思
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
    不设置模式
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate distantFuture]];
  */
}
退出-退出当前线程
[NSThread exit];
第二种(奇葩法)
优点:退出RunLoop比较方便-定义个标记 while(flag){...}
- (void)run
{
    while (1) {
        [[NSRunLoop currentRunLoop] run];
    }
}


文/niu神DNS(简书作者)
原文链接:http://www.jianshu.com/p/cf4915508929
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

相关文章推荐

解密——神秘的RunLoop

原文链接:http://www.cocoachina.com/ios/20160612/16631.html 引言 一直以来RunLoop就是个神秘的领域,好多2.3年的开发者都不能准确的...

解密-神秘的 RunLoop

原文出处: niu神DNS    引言 一直以来RunLoop就是个神秘的领域,好多2.3年的开发者都不能准确的表述它的作用,说它神秘,其实RunLoop并没有大家想象中的那么神秘...

iOS开发学习之NSTimer失效、NSTimer与runloop之间的关系、解密NSTimer

1. 今天在开发的时候,遇到NSTimer无效、所以也到网上找了一些资料,看看究竟怎么回事儿、     再次也做一次分享、方便有需要的朋友。  1.   NSTimer是做什么的? 1.简单的理...

解密--神秘的gluPerspective

在前段时间的OpenGL平面坐标与世界坐标的互转博文中,了解了世界坐标worldCoord向相机坐标系转换方法,相机坐标如何获得投影坐标,投影坐标如何转换屏幕坐标,我们已经很清楚啦。可是有时我们下面代...

心得16--网络编程7-Url-解密IE的神秘面纱

1.  URL(Uniform Resource Locator)类代表统一资源定位器,统一资源定位器是指互联网“资源”的名称。资源可以是简单的文件或目录,也可以是对跟为复杂的对象的引用,例如:对数据...

RunLoop 用例 demo

  • 2016-04-22 13:43
  • 55KB
  • 下载

深入理解Runloop

RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,介绍 RunLoop 的概念以及底层实现原理。之后会介绍一下在 iOS 中,苹果是如何...

RunLoop示例

  • 2012-07-13 10:37
  • 28KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)