需要关于使用 GCD 将块添加到队列(objective-c)的建议

Posted

技术标签:

【中文标题】需要关于使用 GCD 将块添加到队列(objective-c)的建议【英文标题】:need advice about adding blocks to a queue (objective-c) using GCD please 【发布时间】:2011-12-08 16:15:25 【问题描述】:

我有一个使用 GCD 的具有多线程功能的 iPad 应用程序。

当我需要做某种类型的后台处理时,我使用以下代码:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^ -backgroundProcessing- **

所以我的两个问题是:

1) 由于我已将 ALL 的后台处理添加到同一个队列中,并且队列总是从 FIFO 出列,它们还会同时运行吗?我假设他们会,但我不确定。

2) 根据 Apple-Docs 我已经知道了

系统为每个应用程序提供三个并发调度 排队。这些队列对于应用程序是全局的,并且是 仅按优先级区分。

但是,由于我的处理不需要 DISPATCH_QUEUE_PRIORITY_HIGH、DISPATCH_QUEUE_PRIORITY_LOW 或 DISPATCH_QUEUE_PRIORITY_BACKGROUND,将我所有的后台处理放在 DISPATCH_QUEUE_PRIORITY_DEFAULT 全局队列上是否可取/好的/良好做法/无论如何/?或者我应该开始创建自定义队列,以便我可以使用多个。而且,如果我确实创建更多队列,会不会有任何性能提升?

【问题讨论】:

我强烈建议您创建自己的队列并保留对它的引用。这样你就知道它们在自己的线程上执行。 【参考方案1】:

1) 不,全局队列在这方面有特殊作用。它们可以在不同的线程上同时执行多个块。如果您不关心排序,它们或多或少有一种快速进入后台作业的方法(请参阅 [1],提交到这些全局并发队列的块可以相对于彼此同时执行。)。如果您需要顺序排序,请为您的任务创建一个队列。它们非常轻巧,因此对性能影响不大。

2) 默认优先级对于正常任务应该没问题。在创建 CPU 负载密集型任务或更复杂的队列层次结构(因为您可以将队列放入队列中)时,优先级会变得更有趣。

PS:我绝对推荐 WWDC 2010 和 2011 年的 GCD 视频,因为它们对 GCD 更具体的部分提供了一些见解。

[1]http://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

【讨论】:

好的,我会将所有处理添加到全局队列 DEFAULT。我的印象是添加更多队列会提高效率,但我不确定。在发布之前,我还查看了 WWDC 视频。需要澄清这一点。谢谢

以上是关于需要关于使用 GCD 将块添加到队列(objective-c)的建议的主要内容,如果未能解决你的问题,请参考以下文章

Objective-C IOS多线程之GCD深入理解

将调度障碍 (GCD) 添加到自定义队列但不添加到全局并发队列

《Objective-C 高级编程》干货三部曲:GCD篇

GCD的使用

Pimcore 5:以编程方式将块添加到Areablock(文档自动化)

使用 Parse 时 GCD 串行队列似乎没有串行执行