Grand Central Dispatch async vs sync

时间:2012-02-08 20:03:36

标签: iphone ios grand-central-dispatch

我正在阅读有关GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?

从我理解的异步执行事情的顺序是它获取的东西,而同步执行串行..

但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情的执行顺序..

我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了一些东西。

5 个答案:

答案 0 :(得分:31)

不幸的是,第一个答案并不完整。是的,同步将阻止,异步不会,但是需要考虑其他语义。调用dispatch_sync()还会导致代码等到该队列上的每个待处理项都完成执行,同时使其成为所述工作的同步点。 dispatch_async()将简单地将工作提交到队列并立即返回,之后它将“在某个时刻”执行,您需要以其他方式跟踪该工作的完成(通常通过在另一个dispatch_async中嵌套一个dispatch_async - 请参阅例如手册页。)

答案 1 :(得分:19)

sync表示函数将BLBL当前线程直到它完成,async意味着它将在后台处理,函数将不会阻塞当前线程。

如果要串行执行块检查创建串行调度队列

答案 2 :(得分:8)

从手册页:

  

<强> FUNDAMENTALS

Conceptually, dispatch_sync() is a convenient wrapper around
dispatch_async() with the addition of a semaphore to wait for completion
of the block, and a wrapper around the block to signal its completion.
See dispatch_semaphore_create(3) for more information about dispatch sem-
aphores. The actual implementation of the dispatch_sync() function may be
optimized and differ from the above description.

答案 3 :(得分:5)

任务可以同步或异步执行。

同步函数仅在任务完成后才返回当前队列的控件。它会阻塞队列并等待任务完成。

异步函数在任务发送到不同队列后立即返回当前队列的控制权。它不会等到任务完成。它不会阻止队列。

仅在Asynchronous中我们可以添加延迟 - &gt; asyncAfter(deadline: 10..

答案 4 :(得分:1)

使用GCD,您可以分派synchronouslyasynchronously的任务。

任务完成后,synchronous函数将控制权返回给调用者。您可以通过调用DispatchQueue.sync(execute:)来同步安排工作单元。

asynchronous函数立即返回,命令任务开始但不等待其完成。因此,异步功能不会阻止当前执行线程继续进行下一个功能。您可以通过调用DispatchQueue.async(execute:)异步安排工作单元。

了解更多here