原文鏈接:https://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=400417748&idx=1&sn=0c5f6747dd192c5a0eea32bb4650c160&3rd=MzA3MDU4NTYzMw==&scene=6#rd
1趴生、iOS RunLoop都干了什么
RunLoop是一個接收處理異步消息事件的循環(huán)蓖宦,一個循環(huán)中:等待事件發(fā)生襟齿,然后將這個事件送到能處理它的地方。
RunLoop主要處理以下6類事件:
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__();
①Observer事件涂籽,runloop中狀態(tài)變化時進行通知。(微信卡頓監(jiān)控就是利用這個事件通知來記錄下最近一次main runloop活動時間,在另一個check線程中用定時器檢測當前時間距離最后一次活動時間過久來判斷在主線程中的處理邏輯耗時和卡主線程)骨稿。這里還需要特別注意鳖目,CAAnimation是由RunloopObserver觸發(fā)回調來重繪扮叨,接下來會講到。
②Block事件领迈,非延遲的NSObject PerformSelector立即調用彻磁,dispatch_after立即調用,block回調狸捅。
③Main_Dispatch_Queue事件:GCD中dispatch到main queue的block會被dispatch到main loop執(zhí)行衷蜓。
④Timer事件:延遲的NSObject PerformSelector,延遲的dispatch_after尘喝,timer事件磁浇。
⑤Source0事件:處理如UIEvent,CFSocket這類事件朽褪。需要手動觸發(fā)置吓。觸摸事件其實是Source1接收系統(tǒng)事件后在回調 __IOHIDEventSystemClientQueueCallback() 內(nèi)觸發(fā)的 Source0,Source0 再觸發(fā)的 _UIApplicationHandleEventQueue()缔赠。source0一定是要喚醒runloop及時響應并執(zhí)行的交洗,如果runloop此時在休眠等待系統(tǒng)的 mach_msg事件,那么就會通過source1來喚醒runloop執(zhí)行橡淑。
⑥Source1事件:處理系統(tǒng)內(nèi)核的mach_msg事件构拳。(推測CADisplayLink也是這里觸發(fā))。