RunLoop讲解

一般主线程会自动运行runloop,我们一般情况下不用管。而在子线程中,我们需要手动去运行它。你可以把它想象成一个循环,如果没有这个循环,子线程完成任务后,这个线程就结束了。所以这个时候我们就要运行一个runloop,用于处理种种事件,而让它不结束。而没有事件发生的时候, 会处于休眠状态,以节省电量。

那么一般在什么情况下用到呢

需要使用Port或者自定义Input Source与其他线程进行通讯。

需要在线程中使用Timer。

需要在线程上使用performSelector*****方法。

需要让线程执行周期性的工作。

举个例子 定义一个NSTimer来隔一会调用某个方法  但这时你在拖动textVIew不放手  主线程就被占用了。 timer的监听方法就不调用  直到你松手 ,,这时吧nstimer加到 runloop里  就相当于告诉主循环 腾出点时间来给timer  ,再拖动textView就不会因主线程被占用而不调用了


应用场景举例:主线程的 RunLoop 里有两个预置的 Mode:kCFRunLoopDefaultMode 和 UITrackingRunLoopMode。这两个 Mode 都已经被标记为"Common"属性。DefaultMode 是 App 平时所处的状态,TrackingRunLoopMode 是追踪 ScrollView 滑动时的状态。当你创建一个 Timer 并加到 DefaultMode 时,Timer 会得到重复回调,但此时滑动一个TableView时,RunLoop 会将 mode 切换为 TrackingRunLoopMode,这时 Timer 就不会被回调,并且也不会影响到滑动操作。

有时你需要一个 Timer,在两个 Mode 中都能得到回调,一种办法就是将这个 Timer 分别加入这两个 Mode。还有一种方式,就是将 Timer 加入到顶层的 RunLoop 的 "commonModeItems" 中。"commonModeItems" 被 RunLoop 自动更新到所有具有"Common"属性的 Mode 里去

// 下面一行timer是已经被添加进去

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

// 下面一行, 该线程的runloop会运行起来,timer才会起作用

[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:3]];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • RunLoop 是 iOS 和 OS X 开发中非常基础的一个概念,这篇文章将从 CFRunLoop 的源码入手,...
    iOS_Alex阅读 920评论 0 10
  • 转载:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling阅读 1,481评论 0 13
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大饼炒鸡蛋阅读 1,188评论 0 6
  • 小时候,不知道你是否有这样的期待,希望讲台上那个温柔美丽的老师恰好是自己的妈妈,我有,以至于上了高中还会误喊老师为...
    李豫一阅读 287评论 0 0
  • dede手机模板调用及注意事项 单篇文章调用 说明: typeid='1' 栏目id; view.php?aid=...
    null_su阅读 1,292评论 0 0