美文网首页
RunLoop总结

RunLoop总结

作者: ChancePro | 来源:发表于2018-04-26 17:19 被阅读13次

    Runloops是线程相关底层基础的一部分。它的本质和字面意思一样运行着的循环(事件处理的循环)。
    作用:接受循环事件和安排线程的工作。
    目的:让线程在有任务的时候忙于工作,而没有任务的时候处于休眠状态。

    Runloop概念

    Runloop运行循环
    iOS中通常所说的Runloop指的是NSRunloop(Foundation框架)或者CFRunloopRef(CoreFoundation框架),CFRunloopRef是纯C的函数,而NSRunloop仅仅是CFRunloopRef的一层OC封装。

    Runloop作用

    1. 保持程序的持续运行。
    2. 处理App中的各种事件。(如:touches触摸事件、NSTimer定时器事件、Selector事件)
    3. 节省CPU资源,提高程序性能(有事情就做事情,没事情就休息,资源释放)
    4. 负责渲染屏幕上的所有UI。

    Runloop开启&退出

    在UIApplicationMain函数内部开启了一个和主线程相关的RunLoop (保证主线程不会被销毁),导致 UIApplicationMain 不会返回,一直在运行中,也就保证了程序的持续运行。
    Runloop 的退出条件:
    App退出;线程关闭;设置最大时间到期;

    RunLoop和线程关系

    1. 每条线程都有唯一的一个与之对应的Runloop对象。
    2. 主线程的RunLoop已经自动创建,子线程的RunLoop需要主动创建。
    3. RunLoop在第一次获取时创建,在线程结束时销毁。
    4. Runloop对象是利用字典来进行存储,Key:线程 Value:线程对应的Runloop
    创建子线程对应的Runloop

    currentRunLoop

    RunLoop相关类

    CFRunLoopRef: RunLoop本身
    CFRunLoopModeRef: 运行模式
    CFRunLoopSourceRef: 事件源
    CFRunLoopTimerRef: Timer事件
    CFRunLoopObserverRef: 观察者(监听者)

    1. 一条线程 对应一个 Runloop,Runloop 总是运行在某种特定的CFRunLoopModeRef(运行模式)下。
    2. 每个 Runloop 都可以包含若干个 Mode ,每个 Mode 又包含Source源 / Timer事件 / Observer观察者。
    3. 在 Runloop 中有多个运行模式,每次调用 RunLoop 的主函数【__CFRunloopRun()】时,只能指定其中一个 Mode(称 CurrentMode)运行, 如果需要切换 Mode,只能是退出 CurrentMode 切换到指定的 Mode 进入,目的以保证不同 Mode 下的 Source / Timer / Observer 互不影响。
    4. Runloop 有效,mode 里面 至少 要有一个timer(定时器事件) 或者是source(源)。
    Mode

    kCFRunLoopDefaultMode App的默认Mode,通常主线程是在这个Mode下运行。
    UITrackingRunLoopMode 界面跟踪 Mode,用于 ScrollView 追踪触摸滑动
    UIInitializationRunLoopMode 在刚启动 App 时第进入的第一个 Mode,启动完成后就不再使用。
    GSEventReceiveRunLoopMode 接受系统事件的内部 Mode,通常用不到。
    kCFRunLoopCommonModes 一种模式组合

    Source

    Source0:非基于端口Port的事件(用于用户主动触发的事件,如:点击按钮或点击屏幕)。
    Source:基于端口Port的事件(通过内核和其他线程互相发送消息)

    Timer

    NSTimer受RunLoop的Model影响。GCD定时器不受RunLoop影响。

    Observer

    消息循环中的监听器

    RunLoop休眠

    RunLoop 最核心的事情就是保证线程在没有消息时休眠以避免占用系统资源,有消息时能够及时唤醒。 RunLoop 的这个机制完全依靠系统内核来完成,具体来说是苹果操作系统核心组件 Darwin 中的 Mach 来完成的。

    相关文章

      网友评论

          本文标题:RunLoop总结

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