我正在阅读有关GCD调度队列的文档,并且在其中他们说队列是FIFO,所以我想知道这对异步/同步调度有什么影响?
从我理解的异步执行事情的顺序是它获取的东西,而同步执行串行..
但是当你编写你的GCD代码时,你决定了事情发生的顺序..所以只要你知道你的代码中发生了什么,你应该知道事情的执行顺序..
我的问题是,这里有异步的好处吗?我对这两件事的理解中遗漏了一些东西。
答案 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,您可以分派synchronously
或asynchronously
的任务。
任务完成后,synchronous
函数将控制权返回给调用者。您可以通过调用DispatchQueue.sync(execute:)
来同步安排工作单元。
asynchronous
函数立即返回,命令任务开始但不等待其完成。因此,异步功能不会阻止当前执行线程继续进行下一个功能。您可以通过调用DispatchQueue.async(execute:)
异步安排工作单元。
了解更多here