我正在编写一个带有插件系统的应用程序。插件必须在主线程上工作(这不是问题的一部分,我不是在寻找一堆说我应该删除此要求的答案)。
插件异步初始化,因此 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 操作有更高的开销吗?
最佳答案
“双倍开销”实际上非常低,但是您可以使用一种稍微更好的设计模式,它也更直观。创建操作队列,然后使用dispatch_set_target_queue(queue,dispatch_get_main_queue())使其本质上成为主队列的子队列。这将确保它在主线程上执行,同时不需要您进行交叉提交 - 您只需将插件操作直接提交到操作队列即可。
关于objective-c - Grand Central Dispatch 延迟执行设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896191/