RunLoop相關

iOS底層原理總結(jié) - RunLoop
解密 Runloop

Runloop是一種在當前線程,持續(xù)調(diào)度各種任務的運行機制。

while(alive) {
    performTask() //執(zhí)行任務
    callout_to_obsever() //通知外部,用于告知外部某個任務已被執(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的一張圖:


rl00.png
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 深入理解RunLoop 由ibireme| 2015-05-18 |iOS,技術 RunLoop 是 iOS 和 ...
    橙娃閱讀 960評論 1 2
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20150601/11970.html RunL...
    Gatling閱讀 1,547評論 0 13
  • RunLoop 的概念 一般來講,一個線程一次只能執(zhí)行一個任務,執(zhí)行完成后線程就會退出。如果我們需要一個機制,讓線...
    Mirsiter_魏閱讀 670評論 0 2
  • https://blog.ibireme.com/2015/05/18/runloop/ RunLoop 是 iO...
    SmallDe閱讀 776評論 0 51
  • 轉(zhuǎn)自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 1,065評論 0 4

友情鏈接更多精彩內(nèi)容