美文网首页
从NSTimer的运行机制来了解RunLoop

从NSTimer的运行机制来了解RunLoop

作者: 三长一短就选C | 来源:发表于2018-06-28 17:35 被阅读0次

    先了解下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]];

    相关文章

      网友评论

          本文标题:从NSTimer的运行机制来了解RunLoop

          本文链接:https://www.haomeiwen.com/subject/ndzgyftx.html