Runloop

作者: MissSunRise | 来源:发表于2021-05-31 19:23 被阅读0次

    没有Runloop:

    代码执行完毕后,直接执行return 0。程序执行结束。

    有Runloop:

    程序并不会马上退出,而是保持运行状态

    基本作用:

    保持程序的持续运行

    处理App中的各种事件

    节省CPU资源,提高程序性能

    int retVal = 0;.png

    当有事件来的时候就处理,完成后就为0,继续睡眠。

    RunLoop与线程

    一条线程对应一个RunLoop对象

    保存方式是 保存在全局的字典当中,以线程为Key,对象为value

    生命周期:生->线程创建时,RunLoop第一次被获取的时候创建对象
    死->当线程结束时被销毁

    主线程一开始就有RunLoop , 子线程默认没有被开启。

    模式:

    一个RunLoop对象有若干个Mode,每个Mode又包含若干个Source0/Source1/Timer/Observer

    RunLoop启动时只能选择其中一个Mode,作为currentMode

    如果需要切换Mode,只能退出当前Loop,再重新选择一个Mode进入

    不同组的Source0/Source1/Timer/Observer能分隔开来,互不影响

    如果Mode里没有任何Source0/Source1/Timer/Observer,RunLoop会立马退出

    常见的2种Mode

    kCFRunLoopDefaultMode(NSDefaultRunLoopMode):App的默认Mode,通常主线程是在这个Mode下运行
    (默认模式)

    UITrackingRunLoopMode:界面跟踪 Mode,用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他 Mode 影响
    (滑动模式)

    Run Loop Observer Activities.png

    执行流程图

    执行逻辑:所谓的执行逻辑就是

    你不做事,这个App开着其实是在休眠的,CPU没有运行。

    但是你一做事情,或收到消息,RunLoop就会接受到事件,去处理一些事情。

    处理完以后,再次进入到休眠中,一直循环。

    休眠的细节

    使用底层代码使CPU停止,而不是使用While循环,这样保证CPU不处理程序的任务,完全的休眠。

    等有消息的时候在唤醒线程

    Runloop 是怎么响应用户操作的, 具体流程是什么样的?

    Source1 捕捉事件
    Source0 处理事件

    程序中添加每3秒响应一次的NSTimer,当拖动Tableview时timer可能无法响应要怎么解决?

    将NSTimer加入到RunLoop对象中去,设置common模式。
    Timer与RunLoop的关系。RunLoop里面有Mode,而mode里面有Timer.
    当Timer设置common模式时,

    结构

    // 模式
    //1. Name 模式名字
    //2. 处理者
    //3. 捕捉者
    //4. 如果添加了观察者,在这里存放
    //5. 存放这个模式能够使用的计时器

    typedef struct _CFRunLoopMode CFRunLoopModeRef;.png

    //RunLoop 对象
    // 1.所在线程
    // 2.通用模式,如果有计时器被设置了通用模式,那么这个里面就装着有的对象可以同时多个模式被使用。
    // 3.通用模式对象, 存放在这个集合中的对象能够被设置为通用模式
    // 4.当前使用的模式
    // 5.所有模式

    typedef struct CFRunLoop 米 CFRunLoopRef;.png

    相关文章

      网友评论

          本文标题:Runloop

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