Runloop流程总结

915 阅读2分钟

Source0 和 Source1 的区别是什么!

1.什么是runloop

1.概念

通俗来说就是一个Do-While循环,循环管理各种事件

2.特点

1.没有消息的时候休眠
2.有消息的时候唤醒
3.源
    1.异步的inputSources, 
    2.同步的TimerSources

3.一个runloop可以有几个model?

1.常用有三种,current只有一种
    1.defaultMode
    2.UITrackingMode
    3.CommondMode
2. runloop的获取
    1.getMainRunLoop->_CFRunLoopGet0
    2.getCurrentRunLoop->_CFRunLoopGet0

4.线程和runLoop

1.全局变量保存各个线程和各个 RunLoop
2.对象的关系,初始化的创建一个主线程的 RunLoop
3.子线程的 RunLoop 获取的时候开始创建
4.RunLoop 的生命周期和线程的生命周期有关系!子线程销毁的时候,RunLoop被销毁了!!!
5.线程中的runloop是以懒加载形式存在的,默认没有开启

5._CFRunLoopGet0做了什么?

1.创建全局的dict保存主runloop
2.根据传进来的线程,找到对应的runloop
3.注册回调,当线程销毁时,销毁对应的runloop

5.CFRunLoop的数据结构

1.CFMutableSetRef_commonModes
2.CFMutableSetRef_commonModeItems
    1.事件源: obser/timer,Source 
3.CFRunloopModeRef_currentMode:标识了当前runloopMode的模式
4.CFMutableSetRef_modes

6.CFRunLoopMode

1.Source0  
2.Source1
3.observers
4.timers

2.runloop的执行流程

    1.runloop的数据结构中存放了Block任务
    2.runloop中处理的6类事件:整个流程围绕着这6类事件
        1.__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION_()
        2.__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK
        3.__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE
        4.__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION
        5.__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_CALLBACK_FUNCTION
        6.__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_CALLBACK_FUNCTION
    3.屏幕点击事件是source1,会交回source0处理,可以添加符号断点,观察5.6的调用顺序
1.CFRunLoopRun->while(finish && stop)->CFRunLoopRunSpecific()
    1.port:通过端口,去获取对应的消息队列
    2.主线程port:获取主线程端口,便于和主线程通讯
    3.GCD中根队列的port:处理GCD中的事件 
        1.GCD根队列管理着所有的子队列
    ```
        1.进程之间的通信
            1.IPC管道,
            2.消息队列:通过端口,去消息队列中读取消息
        2.点击屏幕算port操作吗?
        
    ```
2.通知观察者(observer)即将要处理Timer事件
3.通知观察者(observer)即将要处理Source0事件
4.处理Source0事件(runloop中存放的Block任务)
拿到port后,消息是怎么读取的?读取消息,睡眠当前线程

只有主线程上的GCD,会依赖runloop的唤醒,对于子线程来说,消息调度依然又GCD进行管理
GG... (待续)