美文网首页
RunLoop基本概念

RunLoop基本概念

作者: Code_人生 | 来源:发表于2019-09-30 14:01 被阅读0次

    一、RunLoop是什么?

    • 运行循环
    • 是个结构体、是个对象,这个对象提供了一个入口函数
    • 程序会进入 do..while循环
    • 循环处理一些事情

    二、Runloop的作用

    • 保持程序的持续运行
    • 处理APP中的各种事件(触摸、定时器、performSelector)
    • 节省cpu资源、提高程序的性能; 该做事就做事,该休息就休息。类似如下代码
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            while (1) {
                NSLog(@"hello");
                static int a = 0;
                if (a == 50000) {
                    sleep(30);
                }
                NSLog(@"======%d======",a);
                a += 1;
            }
        }
        return 0;
    }
    
    1. 保证线程不退出。
    2. 负责监听所有的事件(iOS中的触摸、时钟、网络事件)
    3. RunLoop负责绘制UI

    三、Runloop的item

    • block应用:__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__
    • 调用timer:__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
    • 响应source0:__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
    • 响应source1: __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
    • GCD主队列:__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__
    • observer源:__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__

    RunLoop 处理的事件
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__();
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__();
    static void __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__();
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__();
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__();
    static void __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__();

    四、runloop与线程的关系

    Runloop:线程.png
    • 一一对应关系, 通过一个全局可变CFMutableDictionaryRef(就是key-value)
    • runloop的创建, __CFRunLoopCreate(pthread_main_thread_np())
    • runloop 存储, CFDictionarySetValue(dict, pthreadPointer(pthread_main_thread_np()), mainLoop);
    • runloop 获取, CFDictionaryGetValue(__CFRunLoops, pthreadPointer(t))
    1. 线程 -- runloop -- timer
    2. 子线程runloop 默认不开启
    3. timer 依赖于runloop
    RunLoop的金典.png
    Runloop结构.png
    • NSDefaultRunLoopMode:App默认mode,通常主线程在这个mode下运行
    • UITrackingRunLoopMode:界面跟踪mode,用于ScrollView跟踪触摸滑动,保证滑动时不受其他mode影响
    • NSRunLoopCommonModes:占位用的mode,不是一个真正的mode,相当于NSDefaultRunLoopMode+UITrackingRunLoopMode
    • UIInitializationRunLoopMode(系统初始化模式):刚启动App时进入的第一个mode,启动完成之后不再使用
    • GSEventReceiveRunLoopMode(系统内核模式):接受系统事件的内部mode,通常用不到
    Runloop机制.png
    RunLoop的结构.png
    RunLoop的原理.png

    RunLoop简易执行流程

    相关文章

      网友评论

          本文标题:RunLoop基本概念

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