美文网首页
RunLoop相关

RunLoop相关

作者: 萝卜丝巾 | 来源:发表于2020-08-13 10:58 被阅读0次


    引文:


    1. 概念

    2. 数据结构

    3. 事件循环

    4. Runloop与NSTimer

    5. Runloop与多线程


    概念:

    runloop 是由系统内部维护的事件循环对消息/事件进行管理的对象

    没有消息需要处理时,系统进入休眠状态,节约资源.

    用户态 --> 内核态
    

    如果有消息需要处理,会被立即唤醒 (手动唤醒/NSTimer/Source1)

    内核态 --> 用户态
    
    image.png
    image.png
    数据结构

    NSRunLoop是对CFRunLoop的封装,提供了面向对象的api.
    CFRunLoopRef 是在 CoreFoundation 框架内的,它提供了纯 C 函数的 API,所有这些 API 都是线程安全的。
    NSRunLoop 是基于 CFRunLoopRef 的封装,提供了面向对象的 API,但是这些 API 不是线程安全的。

    • CFRunLoop

    • CFRunLoopMode

    • Source/Timer/Observer

    CFRunLoop

    image.png

    CFRunLoopTimer

    是基于时间的触发器,它和 NSTimer 是toll-free bridged 的,可以混用。其包含一个时间长度和一个回调(函数指针)。当其加入到 RunLoop 时,RunLoop会注册对应的时间点,当时间点到时,RunLoop会被唤醒以执行那个回调。


    CFRunLoopObserver

    观测时间点

    typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
        kCFRunLoopEntry         = (1UL << 0), // 即将进入Loop
        kCFRunLoopBeforeTimers  = (1UL << 1), // 即将处理 Timer
        kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
        kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
        kCFRunLoopAfterWaiting  = (1UL << 6), // 刚从休眠中唤醒
        kCFRunLoopExit          = (1UL << 7), // 即将退出Loop
    };
    

    一个RunLoop对象可以对应多个Model, 每个Model 又有多个source/timer/observer

    image.png
    CommonMode 的特殊性

    NSRunLoopCommonModes

    • CommonMode不是实际存在的一种Mode.

    • 是同步Source/Timer/Observer到多个Mode中的一种技术方案


    事件循环机制:
    image.png
    RunLoop和NSTimer

    滑动tableview的时候定时器还会生效吗?
    当滑动tableview的时候定时器会从kCFRunLoopDefaultMode 切换到UITrackingRunLoopMode


    怎么实现一个常驻线程
    为当前线程开始runloop
    向该runloop中添加port/Source维护runloop的事件循环\
    启动该runloop
    

    相关文章

      网友评论

          本文标题:RunLoop相关

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