0

我正在用插件系統編寫應用程序。插件必須在主線程中工作(這不是問題的一部分,我不是在尋找一堆答案,說我應該刪除這個要求)。Grand Central Dispatch延遲執行設計模式

插件異步初始化,因此UI在啓動時不會掛起幾秒鐘,但其他代碼在啓動後立即開始與插件進行交互。這顯然需要延遲,直到插件完成加載。

這裏是我這麼遠......

// Create operation queue 
dispatch_queue_t queue = dispatch_queue_create(...); 
dispatch_suspend(queue); 

// Load the plugins 
dispatch_group_t group = dispatch_group_create(); 
for each plugin { 
    dispatch_group_async(group, dispatch_get_main_queue(), ^{ 
     load... 
    }); 
} 
dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    dispatch_resume(queue); 
}); 

// Add operations that interact with the plugins 
dispatch_async(queue, ^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     operation... 
    }); 
}); 

這將意味着提交的任何操作都將無法啓動,直到插件加載完成,然而,任何新的操作都將經過兩個隊列在實際處理之前。這是一個很大的開銷嗎?開始時是否值得排隊,然後在準備好不會排隊的方法時交換方法實現?這樣做會更棘手,我不知道這是否值得。

最後,這種類型的問題有更好的設計模式嗎?也許我應該使用NSOperations和NSOperationQueues與依賴關係?或者他們的開銷比基本的GCD操作更高?

回答

2

「雙重開銷」實際上非常低,但您可以使用稍微更好的設計模式,這也更直觀。創建您的操作隊列,然後使用dispatch_set_target_queue(queue, dispatch_get_main_queue()),使其成爲主隊列的子隊列。這將確保它在主線程上執行,而不需要您執行交叉提交 - 您只需將插件操作直接提交給操作隊列即可。

+0

哦完美!我已經閱讀了一些文檔,並觀看了一些關於GCD的WWDC會議,但我一定錯過了這一點。感謝您的幫助,這正是我需要的。 – danpalmer

相關問題