NSRunLoop理解之理論

總論:
每一個線程都有其對應的RunLoop,但是默認非主線程的RunLoop是沒有運行的,需要爲RunLoop添加至少一個事件源,然後去run它。一般情況下我們是沒有必要去啓用線程的RunLoop的,除非你在一個單獨的線程中需要長久的檢測某個事件。

由來:
爲了讓線程能隨時處理事件但並不退出,需要一個機制。
比如Windows中的消息循環,OS X/iOS對應的是RunLoop。

本質:
實際上是一個對象,對象管理了其需要處理的事件和消息,內部實現Event Loop邏輯。
執行了入口函數,函數內部,便處於“接受消息->等待->處理”的循環中,知道循環結束。

應用:
OS X/iOS提供了NSRunLoop、CFRunLoopRef兩個對象。
後者是純C,線程安全;前者是基於後者的封裝,不是線程安全。

蘋果不允許直接創建RunLoop,提供了兩個自動獲取的函數:
CFRunLoopGetMain()、CFRunLoopGetCurrent()。
線程剛創建時沒有RunLoop,不主動獲取,一直不會有。RunLoop的創建發生在第一次獲取,銷燬發生在線程結束時。

使用規則:
一個RunLoop包含若干個Mode,每個Mode包含若干Source/Timer/Observer.
每次調用RunLoop的主函數是,只能指定一個Mode,稱爲CurrentMode。如切換,需退出Loop。

後續給出使用demo及深入分析開源框架中的用法。

參考:
http://www.cocoachina.com/ios/20150601/11970.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章