我正在编写一个带有插件系统的应用程序。插件必须在主线程上工作(这不是问题的一部分,我不是在寻找一堆说我应该删除这个要求的答案)。
插件异步初始化,因此 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 操作有更高的开销吗?