總論:
每一個線程都有其對應的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及深入分析開源框架中的用法。