美文网首页
RunLoop简单探索

RunLoop简单探索

作者: 佛祖ohmygod | 来源:发表于2021-04-12 03:26 被阅读0次

    RunLoop

    • RunLoop是事件接收和分发机制的一个实现,是线程相关的基础框架的一部分,一个RunLoop就是一个事件处理的循环,用来不停的调度工作以及处理输入事件。

    • RunLoop本质是一个 do-while循环,没事做就休息,来活了就干活。与普通的while循环是有区别的,普通的while循环会导致CPU进入忙等待状态,即一直消耗cpu,而RunLoop则不会,RunLoop是一种闲等待,即RunLoop具备休眠功能。 RunLoop的作用

    • 保持程序的持续运行

    • 处理App中的各种事件(触摸、定时器、performSelector)

    • 节省cpu资源,提供程序的性能,该做事就做事,该休息就休息 2、RunLoop和线程的关系

      image.jpeg image.jpeg image.jpeg image.jpeg
    image.jpeg

    RunLoop和mode是一对多
    mode和Item也是一对多


    image.jpeg

    相关面试题

    面试题1当前有个子线程,子线程中有个timer。timer是否能够执行 并进行持续的打印?

    image.jpeg


    不可以,因为子线程的runloop默认不启动, 需要runloop run启动,需要将上述代码改成下面这样


    image.jpeg

    面试题2:RunLoop和线程的关系

    • 每个线程都有一个与之对应的RunLoop,所以RunLoop与线程是一一对应的,其绑定关系通过一个全局的DIctionary存储,线程为key,runloop为value。
    • 线程中的RunLoop主要是用来管理线程的,当线程的RunLoop开启后,会在执行完任务后进行休眠状态,当有事件触发唤醒时,又开始工作,即有活时干活,没活就休息
    • 主线程的RunLoop是默认开启的,在程序启动之后,会一直运行,不会退出
    • 其他线程的RunLoop默认是不开启的,如果需要,则手动开启 面试3:NSRunLoop 和 CFRunLoopRef 区别
    • NSRunLoop是基于CFRunLoopRef面向对象的API,是不安全的
    • CFRunLoopRef是基于C语言,是线程安全的 面试5:以+scheduledTimerWithTimeInterval:的方式触发的timer,在滑动页面上的列表时,timer会暂停回调, 为什么?如何解决?
    • timer停止的原因是因为滑动scrollView时,主线程的RunLoop会从NSDefaultRunLoopMode切换到UITrackingRunLoopMode,而timer是添加在NSDefaultRunLoopMode。所以timer不会执行
    • 将timer放入NSRunLoopCommonModes中执行

    相关文章

      网友评论

          本文标题:RunLoop简单探索

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