iOS底層原理總結(jié) - RunLoop
解密 Runloop
Runloop是一種在當前線程辽装,持續(xù)調(diào)度各種任務(wù)的運行機制心肪。
while(alive) {
performTask() //執(zhí)行任務(wù)
callout_to_obsever() //通知外部,用于告知外部某個任務(wù)已被執(zhí)行犬耻,或者是runloop當前處于什么狀態(tài)站削。
sleep() //休眠
}
performTask主要有
DoBlocks(),
DoSources0(),
DoSources1(),
DoTimers(),
DoMainQueue()
callout_to_obsever主要有
DoObservers-Timer,
DoObservers-Source0,
DoObservers-Activity(分為kCFRunLoopEntry,kCFRunLoopBeforeTimers,kCFRunLoopBeforeSources,kCFRunLoopBeforeWaiting,kCFRunLoopAfterWaiting,kCFRunLoopExit,kCFRunLoopAllActivities)
一個RunLoop包含若干個Mode,每個Mode又包含若干個Source握牧、Timer、Observer娩梨。
每次RunLoop啟動時沿腰,只能指定其中一個Mode,這個Mode被稱作CurrentMode,如果需要切換Mode狈定,只能退出RunLoop颂龙,在重新制定一個Mode進入,這樣做主要是為了分割不同組的Source纽什,Timer措嵌,Observer,讓其互不影響芦缰。但是必須至少有一個Source或者Timer企巢,如果Mode里沒有任何Source0/Source1/Timer/Observer,RunLoop會立馬退出
RunLoop有5種運行模式
1.kCFRunLoopDefaultMode: App的默認Mode让蕾,通常主線程是在這個Mode下運行
2.UITrackingRunLoopMode:界面追蹤Mode浪规,用于Scrollview追蹤觸摸滾動或听,保證界面滑動時不受其他Mode影響
3.UIInitializationRunLoopMode:在剛啟動App時進入的第一個Mode,啟動完成后就不再使用笋婿,會切換到kCFRunLoopDefaultMode
4.GSEventReceiveRunLoopMode:接受系統(tǒng)事件的內(nèi)部Mode誉裆,通常用不到
5.KCFRunLoopCommonModes:這是一個占位用的Mode,作為標記kCFRunLoopDefaultMode和UITrackingRunLoopMode用缸濒,并不是一種真正的Mode
最后引用MrPeak的一張圖: