美文网首页
iOS runloop 知识点总结

iOS runloop 知识点总结

作者: 唯忆青语 | 来源:发表于2021-03-24 17:01 被阅读0次

    一:runloop相关知识

    1. runloop是什么

       runloop是通过内部维护的时间循环,来对事件/消息进行管理的对象

    2. runloop特征

    (1)没有消息处理时休眠,避免资源占用(用户态切换到内核态)

    (2)有消息处理时立刻被唤醒(内核态切换到用户态)

    3. runloop有哪几种mode

    (1) NSDefaultRunLoopMode: 默认模式

    (2) NSRunLoopCommonModes:mode集合

    (3) UITrackingRunloopMode:跟踪用户交互事件

    (4) UIInitializationRunloopMode:初始化模式,程序启动完后不再调用

    (5) GSEventReceiveRunloopMode: 接受系统内部事件

    4. runloop数据结构

    ① CFRunloop: runloop对象 

         由以下几个部分组成。

         Pthred:线程,与runloop是一一对应的关系

         commonModes:       字符串集合。一个字符串对应一种mode

         commonmodelItems:observer/timer/source的统称

         currentMode          当前mode

         Modes               是runloopmode的无序集合

    ② CFRunloopMode: runloop运行模式 

    (由name,source0,source1,observer,timer 组成)

    ③ CFRunloopSource: 输入源/事件源

              有两种:source0: 用户触发的事件

                             Source1: 系统发送的消息

    ④ CFRunloopTimer: 定时源

    ⑤ CFRunloopObserver:观察者 用户监听以下时间点

    l    kCFRunLoopEntry            // 即将进入Loop

    l     kCFRunLoopBeforeTimers    // 即将处理 Timer

    l     kCFRunLoopBeforeSources  // 即将处理 Source

    l     kCFRunLoopBeforeWaiting  // 即将进入休眠

    l     kCFRunLoopAfterWaiting  // 刚从休眠中唤醒

    l     kCFRunLoopExit            // 即将退出Loop

    5. runloop各个数据结构之间的关系

    (1)一个runloop对用多种mode,每个model下又有多种source。Observer,timer

    (2)runloop启动时,只能指定一个mode,这个mode被称为currentMode

    (3)如果需要切换mode,只能退出loop,再重新指定一个mode进入。

    6. runloop实现机制

    (1)、通知观察者 RunLoop 即将启动。

    (2)、通知观察者即将要处理Timer事件。

    (3)、通知观察者即将要处理source0事件。

    (4)、处理source0事件。

    (5)、如果基于端口的源(Source1)准备好并处于等待状态,进入步骤9。

    (6)、通知观察者线程即将进入休眠状态。

    (7)、将线程置于休眠状态,由用户态切换到内核态,直到下面的任一事件发生才唤醒线程。

    - 一个基于 port 的Source1 的事件(图里应该是source0)。

    - 一个 Timer 到时间了。

    - RunLoop 自身的超时时间到了。

    - 被其他调用者手动唤醒。

    (8)、通知观察者线程将被唤醒。

    (9)、处理唤醒时收到的事件。

    - 如果用户定义的定时器启动,处理定时器事件并重启RunLoop。进入步骤2。

    - 如果输入源启动,传递相应的消息。

    - 如果RunLoop被显示唤醒而且时间还没超时,重启RunLoop。进入步骤2

    (10)、通知观察者RunLoop结束。

    二:runloop与线程

    1.runloop与线程是什么关系

    (1)一一对应的关系,一个线程对应一个runloop。

    (2)主线程默认开启runloop,子线程/自己创建的线程需要手动开启runloop。

    相关文章

      网友评论

          本文标题:iOS runloop 知识点总结

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