解密-神秘的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

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

解密——神秘的RunLoop

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

房地产神秘顾客调查方案

一、项目方案设计: 1、调查目的 房地产销售/物业服务部神秘顾客调查的关键目的: 1)根据不同业主体验的关键维度,形成测量指标体系 2)通过暗访了解销售/物业服务表现 3)通过数据分析,...
  • qq_27072151
  • qq_27072151
  • 2015年04月15日 10:34
  • 1168

启动关闭RunLoop

  • baohanqing
  • baohanqing
  • 2016年04月19日 10:08
  • 677

解密--神秘的gluPerspective

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

iOS- 响应者链, runtime, runloop

响应者链 响应者链条概念:iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队...
  • zhz459880251
  • zhz459880251
  • 2016年04月04日 23:51
  • 1211

iOS runloop 详解3 子线程runloop的启动与停止

// // ViewController.m // test_runloop_01 // // Created by jeffasd on 16/7/25. // Copyright © 20...
  • jeffasd
  • jeffasd
  • 2016年07月25日 14:14
  • 2789

RunLoop 总结:RunLoop的应用场景(一)

参考资料好的书籍都是值得反复看的,那好的文章,好的资料也值得我们反复看。我们在不同的阶段来相同的文章或资料或书籍都能有不同的收获,那它就是好文章,好书籍,好资料。 关于iOS 中的RunLoop资料...
  • u011619283
  • u011619283
  • 2016年12月02日 11:54
  • 4064

RunLoop总结:RunLoop的应用场景(四)

今天要介绍的RunLoop使用场景很有意思,在做长期项目,需要跟踪解决用户问题非常有用。 使用RunLoop 监测主线程的卡顿,并将卡顿时的线程堆栈信息保存下来,下次上传到服务器。参考资料关于今天要...
  • u011619283
  • u011619283
  • 2016年12月15日 10:04
  • 3165

RunLoop总结:RunLoop的应用场景(三)

今天要讲的RunLoop的应用场景可能太简单了,所以东西比较少。因为跟UITableView、UICollectionView等的滑动优化有关,就顺便总结一下会影响UITableView、UIColl...
  • u011619283
  • u011619283
  • 2016年12月06日 10:34
  • 4245
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解密-神秘的RunLoop
举报原因:
原因补充:

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