0

我正在编写一个带有插件系统的应用程序。插件必须在主线程上工作(这不是问题的一部分,我不是在寻找一堆说我应该删除这个要求的答案)。

插件异步初始化,因此 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 操作有更高的开销吗?

4

1 回答 1

2

“双重开销”实际上非常低,但是您可以使用一种更好的设计模式,它也更直观。创建您的操作队列,然后使用dispatch_set_target_queue(queue, dispatch_get_main_queue())它使其本质上是主队列的子队列。这将确保它在主线程上执行,而不需要您进行交叉提交——您只需将插件操作直接提交到操作队列。

于 2012-10-16T17:54:09.550 回答