詳解Cocoa中RunLoop如何使用
Cocoa中RunLoop如何使用是本文要介紹的內容,CFRunLoop 對象監控任務(task)的輸入源,并在它們為處理做好準備的時候調度控制。
輸入源樣例可能包括用戶輸入設備、網絡鏈接、定期或時間延遲事件,還有異步回調。有3類對象可以被run loop監控:sources、timers、observers。
當這些對象需要處理的時候,為了接收回調,首先必須通過 CFRunLoopAddSource,CFRunLoopAddTimer, or CFRunLoopAddObserver把這些對象放入runloop。 要停止接收它的回調,你也可以稍候通過CFRunLoopRemoveSource從run loop中移除某個對象。
runloop有不同的運行模式,每種模式都有其自身的對象集,runloop監控,同時在該模式下運行。 Core Foundation定義了一種默認模式kCFRunLoopDefaultMode來持有對象,在應用或線程閑置的時候這些對象應該被監控。當一個對象被添加到不認識的模式時,額外模式自動創建。每個runloop有它自己獨立的模式集。
Core Foundation還定義了一個特殊的偽模式kCFRunLoopCommonModes來持有應當被“common”模式集共享的對象。 通過調用CFRunLoopAddCommonMode來添加一個模式到“common”模式集。 默認模式kCFRunLoopDefaultMode 總是common模式集中的一個成員。kCFRunLoopCommonModes 常數決不會傳給CFRunLoopRunInMode。每個run loop有它自己獨立的common模式集。
每個線程恰好有一個runloop,既不可以創建,也不能銷毀線程的run loop。,Core Foundation 根據需要為你創建。通過CFRunLoopGetMain 你可以獲得當前線程的runloop。調用lCFRunLoopRun 來使當前線程的runloop以默認模式運行起 來,直到調用CFRunLoopStop來停止runloop。你也可以調用CFRunLoopRunInMode來使當前線程的run loop以指定模式運行起來一段時間或者直到runloop被停止。 runloop只能在請求模式至少有一個source或者timer可監控的情況下運行起來。
RunLoop可以遞歸運行,你可以在任何run loop 標注內部調用CFRunLoopRun 或 CFRunLoopRunInMode,還可以創建嵌套runloop,并在當前線程調用棧激活,在標注內并沒有限制在那種模式可以運行。你可以創建另一個runloop,激活運行在任何可行的runloop模式,包括任何已經運行在調用堆棧中的更高的模式。
Cocoa 和 Carbon 每個都是建立在 CFRunLoop上來實現它們自己更高級別的事件循環。當編寫一個 Cocoa 或者 Carbon 應用,你可以添加你的sources、timer和observers到它們的run loop對象中。你的對象將會作為常規應用事件循環的一部分來得到監控。使用 NSRunLoop 實例方法 getCFRunLoop 來獲得對應應于cocoa run loop的CFRunLoop,在carbon應用中使用 GetCFRunLoopFromEventLoop 函數.
小結:詳解Cocoa中RunLoop如何使用的內容介紹完了,希望通過本文的學習能對你有所幫助!

















