从NSTimer的运行机制来了解RunLoop

先了解下Runloop的几种模式,常用的有两种,NSDefaultRunLoopMode 默认模式、UITrackingRunLoopMode UI模式  、 NSRunLoopCommonModes  UI模式&默认模式

而Runloop是一个运行循环,负责监听事件,没有事件发生时会进入休眠状态,虽然他再一次循环中只处理一个事件,但他循环一次的时间非常短,所以当他再一次循环中渲染界面的时候会chua的一下就完成了。

再说说NSTimer ,计时器是码字过程中经常会用到的,但是很多时候,对他的运行机制了解的并不够

咱先看下基本用法:

倘若将模式换成默认,会发生个面试老生常谈的问题,就是当UI模式有事件需要响应时,RunLoop会切换到UI模式下完成相应的事件操作,才会回到默认模式下继续执行计时器操作,所以就牵出了NSTimer 的另一种用法

scheduledTimerWithTimeInterval会默认执行[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode],将其加到默认模式下,倘若确定计时器下不会有UI事件产生,可以用这种方式

另外有一点需要注意的是虽然每个线程都会有自己的RunLoop,但是除了主线程外,其他线程的RunLoop都是默认不开启的,咱先来看一段代码

可以发现,当前线程是新开的子线程,但是计时器的却并没有像在主线程的中那样重复执行我们的timerAction方法,那是因为我们子线程中的RunLoop是默认不开启的,他并不会像在主线程中那样有运行循环持续监听我们的计时器事件,解决办法是需要我们手动开启当前线程的RunLoop,像这样


[[NSRunLoop currentRunLoop] run]让当前的RunLoop跑起来,那么问题来了,run后面的代码并没有执行,其实是因为RunLoop不仅仅是个运行循环,还是个特殊的死循环,所以后面的语句并不会执行,解决方法也很简单,只需要给当前的RunLoop一个循环时间就行了[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:10]];

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

推荐阅读更多精彩内容

  • 说明iOS中的RunLoop使用场景1.保持线程的存活,而不是线性的执行完任务就退出了<1>不开启RunLoop的...
    野生塔塔酱阅读 6,856评论 15 109
  • RunLoop 文章目录 RunLoop简介 1.1 什么是RunLoop? 1.2 RunLoop和线程 1.3...
    May_d8f1阅读 307评论 0 1
  • 文章目录 RunLoop简介 1.1 什么是RunLoop? 1.2 RunLoop和线程 1.3 默认情况下主线...
    咖啡绿茶1991阅读 301评论 0 0
  • iOS刨根问底-深入理解RunLoop 概述 RunLoop作为iOS中一个基础组件和线程有着千丝万缕的关系,同时...
    reallychao阅读 837评论 0 6
  • Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,...
    jackyshan阅读 9,928评论 10 75