RunLoop是開源的:RunLoop源碼下載地址
RunLoop是事件接收和分發(fā)機(jī)制的一個(gè)實(shí)現(xiàn),是消息機(jī)制的處理模式。
什么是RunLoop?
- 內(nèi)部就是do-while循環(huán),這個(gè)循環(huán)內(nèi)部不斷地處理各種任務(wù)(如:Sources、Observer、Timer)
- 一個(gè)線程對應(yīng)一個(gè)RunLoop,主線程的RunLoop默認(rèn)已經(jīng)啟動,子線程的RunLoop需要手動啟動(調(diào)用run方法)
- RunLoop只能選擇一個(gè)mode啟動,如果當(dāng)前mode中沒有任何Sources(Source0、Source1)、Timer,那么直接退出RunLoop
RunLoop與線程:
RunLoop主要目的是保證程序執(zhí)行的線程不會被系統(tǒng)終止
每條線程都有唯一的一個(gè)與之對應(yīng)的RunLoop對象
主線程的RunLoop已經(jīng)自動創(chuàng)建好了,子線程的RunLoop需要主動創(chuàng)建
RunLoop在第一次獲取時(shí)創(chuàng)建,在線程結(jié)束時(shí)銷毀
Core Foundation中關(guān)于RunLoop的5個(gè)類:
CFRunLoopRef --- 包含了若干個(gè)CFRunLoopModeRef對象
CFRunLoopModeRef --- RunLoop的對象(若干個(gè)),是一個(gè)集合,包括監(jiān)聽:事件源、定時(shí)器,以及需要通知Observers
CFRunLoopSourceRef --- CFRunLoopModeRef對象中的Set類型元素(若干個(gè))
CFRunLoopTimerRef --- CFRunLoopModeRef對象中的Array類型元素(若干個(gè))
CFRunLoopObserverRef --- CFRunLoopModeRef對象中的Array類型元素(若干個(gè))
其中CFRunLoopSourceRef的分類
-
理論分類
-
實(shí)踐分類(按照
函數(shù)調(diào)用棧分類)- Source0(非基于Port的)
- Source1(基于Port的 --- 通過內(nèi)核和其它線程通信,接收、分發(fā)系統(tǒng)事件)
Source1接收到事件后,會分發(fā)給Source0去處理
Xcode中獲取RunLoop:
Foundation:
[NSRunLoop currentRunLoop]; // 獲得當(dāng)前線程的RunLoop對象
[NSRunLoop mainRunLoop]; // 獲得主線程的RunLoop對象
Core Foundation:
CFRunLoopGetCurrent(); // 獲得當(dāng)前線程的RunLoop對象
CFRunLoopGetMain(); // 獲得主線程的RunLoop對象
CFRunLoopModeRef 系統(tǒng)默認(rèn)注冊了5個(gè)Mode:
kCFRunLoopDefaultMode:App的默認(rèn)Mode,通常主線程是在這個(gè)Mode下運(yùn)行
UITrackingRunLoopMode:界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時(shí)不受其他 Mode 影響
UIInitializationRunLoopMode: 在剛啟動 App 時(shí)第進(jìn)入的第一個(gè) Mode,啟動完成后就不再使用 ---- <用不上>
GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode,通常用不到 ---- <用不上>
kCFRunLoopCommonModes: 這是一個(gè)占位用的Mode,不是一種真正的Mode
