是dispatch_sync(dispatch_get_global_queue(xxx),task)同步还是异步

时间:2012-03-22 12:38:49

标签: ios concurrency queue dispatch

正如Apple的文档所说,dispatch_get_global_queue()是一个并发队列,而dispatch_sync是串行的意思。那么任务是处理异步还是同步?

2 个答案:

答案 0 :(得分:33)

你对队列是什么以及异步与同步意味着什么感到困惑。

队列是可以运行块的实体。这些可以是串行或并发的。串行意味着如果你按照A,B,C,D的顺序放置块,那么它们将被执行A,然后是B,然后是C,然后是D.并发意味着这些相同的块可能以不同的顺序执行,并且可能甚至多于一个(假设您有多个核心可以运行,显然)。

然后进入异步vs同步。异步意味着当您调用dispatch_async时,它将立即返回 ,并且该块将在队列中排队。同步意味着当您调用dispatch_sync时,它将仅在块执行完毕后返回。

所以要完全回答你的问题,如果你dispatch_sync进入一个全局并发队列,那么这个块将会运行,可能与该队列上的其他块并行,但是以同步的方式运行 - 即它不会返回直到块完成。

答案 1 :(得分:0)

Apple Doc说

  

dispatch_get_global_queue

     

返回给定优先级的众所周知的全局并发队列   水平。

     

dispatch_queue_t dispatch_get_global_queue(       长期优先,       无符号长旗);

     

参数

     

priority要检索的队列的优先级。为一个   可能值列表,请参阅“dispatch_queue_priority_t”。这个   值保留供将来使用。你应该总是传递0.返回   值返回请求的全局队列。

     

讨论

     

无法修改众所周知的全局并发队列。   调用dispatch_suspend,dispatch_resume,dispatch_set_context和   与此返回的队列一起使用时,它们没有任何效果   功能

     

可以执行提交给这些全局并发队列的块   同时相互之间。

     

可用性适用于iOS 4.0及更高版本。宣告进入   调度/ queue.h

在讨论中他们说过 - > '提交的块可以彼此同时执行。'

因此可以处理任务彼此异步。