objective-c - Grand Central Dispatch 延迟执行设计模式

标签 objective-c macos cocoa design-patterns 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 操作有更高的开销吗?

最佳答案

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

关于objective-c - Grand Central Dispatch 延迟执行设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12896191/

相关文章:

objective-c - WebKit框架有哪些功能

c++ - Unsigned Long Long 超出范围?

html - 黑色输入背景 - Cocoa WebView

ios - iOS 图像分割

python - 在 Python 中调整 OSX 系统音量

macos - 从另一个 Cocoa 进程在 Lion/ML 上打开 OS X 应用程序,无需恢复 Windows

macos - NSTrackingArea调用自定义代码

cocoa - 当用户将图像粘贴或拖动到 NSImageView 中时,我的代码如何收到通知?

ios - 使用 NSOperationQueue,如何添加到后台队列而不是主队列,以及如何控制操作量?

iphone - 从 UIViewController A 到 B 并获得反馈