引文:
-
概念
-
數(shù)據(jù)結(jié)構(gòu)
-
事件循環(huán)
-
Runloop與NSTimer
-
Runloop與多線程
概念:
runloop 是由系統(tǒng)內(nèi)部維護(hù)的事件循環(huán)對(duì)消息/事件進(jìn)行管理的對(duì)象
沒(méi)有消息需要處理時(shí),系統(tǒng)進(jìn)入休眠狀態(tài),節(jié)約資源.
用戶態(tài) --> 內(nèi)核態(tài)
如果有消息需要處理,會(huì)被立即喚醒 (手動(dòng)喚醒/NSTimer/Source1)
內(nèi)核態(tài) --> 用戶態(tài)


數(shù)據(jù)結(jié)構(gòu)
NSRunLoop是對(duì)CFRunLoop的封裝,提供了面向?qū)ο蟮腶pi.
CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的,它提供了純 C 函數(shù)的 API,所有這些 API 都是線程安全的。
NSRunLoop 是基于 CFRunLoopRef 的封裝,提供了面向?qū)ο蟮?API,但是這些 API 不是線程安全的。
CFRunLoopCFRunLoopModeSource/Timer/Observer
CFRunLoop
image.png

CFRunLoopTimer
是基于時(shí)間的觸發(fā)器,它和 NSTimer 是toll-free bridged 的,可以混用。其包含一個(gè)時(shí)間長(zhǎng)度和一個(gè)回調(diào)(函數(shù)指針)。當(dāng)其加入到 RunLoop 時(shí),RunLoop會(huì)注冊(cè)對(duì)應(yīng)的時(shí)間點(diǎn),當(dāng)時(shí)間點(diǎn)到時(shí),RunLoop會(huì)被喚醒以執(zhí)行那個(gè)回調(diào)。
CFRunLoopObserver
觀測(cè)時(shí)間點(diǎn)
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即將進(jìn)入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即將處理 Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即將處理 Source
kCFRunLoopBeforeWaiting = (1UL << 5), // 即將進(jìn)入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 剛從休眠中喚醒
kCFRunLoopExit = (1UL << 7), // 即將退出Loop
};
一個(gè)RunLoop對(duì)象可以對(duì)應(yīng)多個(gè)Model, 每個(gè)Model 又有多個(gè)source/timer/observer

CommonMode 的特殊性
NSRunLoopCommonModes
CommonMode不是實(shí)際存在的一種Mode.
是同步Source/Timer/Observer到多個(gè)Mode中的一種技術(shù)方案
事件循環(huán)機(jī)制:

RunLoop和NSTimer
滑動(dòng)tableview的時(shí)候定時(shí)器還會(huì)生效嗎?
當(dāng)滑動(dòng)tableview的時(shí)候定時(shí)器會(huì)從kCFRunLoopDefaultMode 切換到UITrackingRunLoopMode
怎么實(shí)現(xiàn)一個(gè)常駐線程
為當(dāng)前線程開(kāi)始runloop
向該runloop中添加port/Source維護(hù)runloop的事件循環(huán)\
啟動(dòng)該runloop