关闭

解密-神秘的RunLoop

179人阅读 评论(0) 收藏 举报
分类:
参考链接: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
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:88849次
    • 积分:1881
    • 等级:
    • 排名:千里之外
    • 原创:97篇
    • 转载:56篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论