iOS開發(fā)中的運(yùn)行循環(huán)機(jī)制

  • RunLoop的概念

每一個(gè)線程都有一個(gè)RunLoop對象,主線程默認(rèn)開啟RunLoop,子線程默認(rèn)不開啟。

RunLoop
  • runloop的兩個(gè)重要元素:
    1. Input Resources 輸入源 performSelector:onThread:...輸入源處理其他線程的消息
    2. Timer Resources 時(shí)間源 處理主線程時(shí)間(UI界面的刷新,滾動,點(diǎn)擊...)
  • RunLoop的作用:
    1. runloop讓主線程一直處于收發(fā)消息的狀態(tài),不會自動結(jié)束,保證了程序的運(yùn)行
    2. 事件處理,點(diǎn)擊事件,手勢
    3. 節(jié)約CPU,無事掛起
  • 什么時(shí)候使用運(yùn)行循環(huán)?

官方文檔是這么說的:The only time you need to run a run loop explicitly is when you create secondary threads for your application. 只有在你創(chuàng)建一個(gè)子線程的時(shí)候才需要run一個(gè)運(yùn)行循環(huán)。主線程RunLoop是保證程序運(yùn)行的基礎(chǔ)和關(guān)鍵
而對于子線程,你需要根據(jù)自己的需要決定是否開啟子線程,如果需要,那么需要自己配置并開啟子線程RunLoop,比如下面四種情況:

  • 使用ports或custom input sources與其他線程通信

  • 在該線程使用timer

  • 使用任一performSelector…方法

  • 需要讓線程執(zhí)行定期任務(wù)

  • Event Loop
function loop() {
    initialize();
    do {
        var message = get_next_message();
        process_message(message);
    } while (message != quit);
}

這種模型通常被稱為Event Loop。這種模型的關(guān)鍵點(diǎn)在于:如何管理事件/消息,如何讓線程在沒有處理消息時(shí)休眠以避免資源占用、在有消息來到時(shí)立刻被喚醒。
所以RunLoop實(shí)際上是一個(gè)對象,這個(gè)對象管理了其需要處理的事件和消息,并提供了一個(gè)入口函數(shù)來執(zhí)行上面Event Loop的邏輯。線程執(zhí)行了這個(gè)函數(shù)后,就會一直處于這個(gè)函數(shù)內(nèi)部“接受消息->等待->處理”的循環(huán)中,直到這個(gè)循環(huán)結(jié)束(比如傳入quit消息),函數(shù)返回。

  • RunLoop的mode
  1. kCFRunLoopDefaultMode: App的默認(rèn) Mode,通常主線程是在這個(gè) Mode 下運(yùn)行的。
  2. UITrackingRunLoopMode: 界面跟蹤 Mode,用于 ScrollView 追蹤觸摸滑動,保證界面滑動時(shí)不受其他 Mode 影響。
  3. UIInitializationRunLoopMode: 在剛啟動 App 時(shí)第進(jìn)入的第一個(gè) Mode,啟動完成后就不再使用。
  4. GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的內(nèi)部 Mode,通常用不到。
  5. kCFRunLoopCommonModes: 這是一個(gè)占位的 Mode,沒有實(shí)際作用。
  • RunLoop的底層實(shí)現(xiàn)

RunLoop的核心是基于底層mach port,進(jìn)入休眠時(shí)調(diào)用的函數(shù)是mach_msg
(),待續(xù)...

RunLoop蘋果官方文檔
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容