iOS RunLoop

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詳解》

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