iOS筆記 - NSRunLoop

概述

我們的應(yīng)用不能對 NSRunLoop 對象進行創(chuàng)建和直接的管理操作。每一個 NSThread 對象(包括 main thread)都按需自動創(chuàng)建一個 NSRunLoop 對像(這里的意思是:線程剛創(chuàng)建時并沒有 RunLoop,如果你不主動獲取,那它一直都不會有)。通過 currentRunLoop() 方法可以訪問當(dāng)前線程的 run loop。

NSRunLoop 和 CFRunLoopRef

  • NSRunLoop 是基于 CFRunLoopRef 的封裝,提供了面向?qū)ο蟮?API,但是這些 API 不是線程安全 (thread-safe)的。

  • CFRunLoopRef 是在 CoreFoundation 框架內(nèi)的,提供了純 C 函數(shù)的 API,所有這些 API 都是線程安全的。

RunLoop 的構(gòu)成

Thread包含一個CFRunLoop,一個CFRunLoop包含一種 CFRunLoopMode,mode包含CFRunLoopSource,CFRunLoopTimer和CFRunLoopObserver。

CFRunLoopModeRef
  1. NSDefaultRunLoopMode: 默認,空閑狀態(tài)

  2. UITrackingRunLoopMode: ScrollView滑動時

  3. UIInitializationRunLoopMode: 在剛啟動App時第進入的第一個 Mode,啟動完成后就退出

  4. GSEventReceiveRunLoopMode: 接受系統(tǒng)事件的 Mode

  5. NSRunLoopCommonModes: 占位用的Mode

每次調(diào)用 RunLoop 的主函數(shù)時,只能指定其中一個 Mode,這個Mode被稱作 CurrentMode。如果需要切換 Mode,只能退出 Loop,再重新指定一個 Mode 進入。

CFRunLoopSourceRef

事件產(chǎn)生的地方,CFRunLoopSourceRef 有兩個版本:Source0 和 Source1。

  • Source0 只包含了一個回調(diào)(函數(shù)指針),它并不能主動觸發(fā)事件。使用時,你需要先調(diào)用 CFRunLoopSourceSignal(source),將這個 Source 標(biāo)記為待處理,然后手動調(diào)用 CFRunLoopWakeUp(runloop) 來喚醒 RunLoop,讓其處理這個事件。

  • Source1 包含了一個 mach_port 和一個回調(diào)(函數(shù)指針),被用于通過內(nèi)核和其他線程相互發(fā)送消息。這種 Source 能主動喚醒 RunLoop 的線程。

CFRunLoopTimerRef

它和 NSTimer 是 toll-free bridged 的,可以混用。其包含一個時間長度和一個回調(diào)(函數(shù)指針)。RunLoop為了節(jié)省資源,并不會在非常準(zhǔn)確的時間點回調(diào)Timer。Timer 有個屬性叫做 Tolerance (寬容度),標(biāo)示了當(dāng)時間點到后,容許有多少最大誤差。

CFRunLoopObserverRef

每個 Observer 都包含了一個回調(diào)(函數(shù)指針),當(dāng) RunLoop 的狀態(tài)發(fā)生變化時,觀察者就能通過回調(diào)接受到這個變化??梢杂^測的時間點有以下幾個:


typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {

kCFRunLoopEntry        = (1UL << 0), // 即將進入Loop

kCFRunLoopBeforeTimers  = (1UL << 1), // 即將處理 Timer

kCFRunLoopBeforeSources = (1UL << 2), // 即將處理 Source

kCFRunLoopBeforeWaiting = (1UL << 5), // 即將進入休眠

kCFRunLoopAfterWaiting  = (1UL << 6), // 剛從休眠中喚醒

kCFRunLoopExit          = (1UL << 7), // 即將退出Loop

};

參考:
http://blog.ibireme.com/2015/05/18/runloop/

https://github.com/ming1016/study/wiki/CFRunLoop

https://developer.apple.com/reference/foundation/nsrunloop

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

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

  • Runloop是iOS和OSX開發(fā)中非?;A(chǔ)的一個概念,從概念開始學(xué)習(xí)。 RunLoop的概念 -般說,一個線程一...
    小貓仔閱讀 1,111評論 0 1
  • 原文地址:http://blog.ibireme.com/2015/05/18/runloop/ RunLoop ...
    大餅炒雞蛋閱讀 1,269評論 0 6
  • 轉(zhuǎn)自http://blog.ibireme.com/2015/05/18/runloop 深入理解RunLoop ...
    飄金閱讀 1,087評論 0 4
  • (一)鬼敲門 子夜,宅子里寂寂無聲。 四太太把被子拽進懷里,死死抱住,把自己裹得緊緊的,瑟縮在床角,依然壓不住心底...
    江元安閱讀 2,496評論 44 44
  • 單元一(研究對象方法、神經(jīng)機制) 1 認知 指人們獲得知識或應(yīng)用知識的過程,或信息加工的過程。 2 感覺 客觀事物...
    星星與七便士閱讀 453評論 0 0

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