我正在用插件系統編寫應用程序。插件必須在主線程中工作(這不是問題的一部分,我不是在尋找一堆答案,說我應該刪除這個要求)。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操作更高?
哦完美!我已經閱讀了一些文檔,並觀看了一些關於GCD的WWDC會議,但我一定錯過了這一點。感謝您的幫助,這正是我需要的。 – danpalmer