RunLoop 介紹
RunLoop 可以認爲是一個基於線程存在的消息處理隊列。它依賴於一個線程,同時又管理線程的運行,使得線程在沒有工作時“休眠”來節約資源,需要的時候再喚醒,在線程裏執行對應的代碼。
Cocoa和CoreFundation都提供了 RunLoop 對象方便配置和管理線程的RunLoop(以下都已Cocoa爲例)。每個線程,包括程序的主線程(main thread)都有與之相應的run loop對象。但是,默認情況下自己創建的線程,RunLoop 默認是不創建的,需要手動調用 [NSRunLoop currentRunLoop] 方法後纔會創建對應的 RunLoop。
在 iOS 中應用啓動時
int main(int argc, char * argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
UIApplicationMain 這個方法創建了主線程的 RunLoop 來處理各種事件。
需要注意的是,NSRunloop 不是線程安全的,在其他線程操作另外一個線程的 RunLoop 可能會出問題,而 CFRunLoopRef 是線程安全的,這兩種類型可以根據情況混合使用
在線程中執行代碼
Cocoa和CoreFundation 支持多種方式來在制定線程執行代碼
上面方法的執行都需要 RunLoop 的支持。如 performSelector: onThread: withObject: waitUntilDone: modes:
如果執行的線程沒有 RunLoop 這個方法就會失效
事件
上圖是 RunLoop 的運行模型。事件源總體分爲定時源和輸入源。
參考資料
示例代碼會在 github 更新後公佈鏈接
《Threading Programming Guide》
《iOS - RunLoop 深入理解》
《深入理解RunLoop - Grand no dou》
《深入理解RunLoop》
《Inter-Process Communication》
《Objective-C之run loop詳解》