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

时间:2011-12-08 16:15:26

标签: objective-c cocoa objective-c-blocks grand-central-dispatch

我有一个使用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全局队列上/ ok / good practice / what-ever /吗?或者我应该开始创建自定义队列,以便我可以使用多个队列。而且,如果我确实创建了更多队列,那么会有任何性能提升吗?

1 个答案:

答案 0 :(得分:3)

1)不,全局队列在此具有特殊作用。它们可以在不同的线程上同时执行多个块。如果您不关心排序,它们或多或少可以快速输入后台作业(参见[1],提交给这些全局并发队列的块可以相互同时执行。< / em>的)。如果需要顺序排序,请为任务创建队列。它们非常轻巧,因此不会对性能产生很大的影响。

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

PS:我绝对推荐WWDC 2010和2011年的GCD视频,因为他们对GCD的更具特色的部分提供了很多见解。

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