我很清楚dispatch_async队列正在执行什么,但我不清楚dispatch_sync的目的是什么。举个例子:这有什么区别:
NSLog(@"A");
NSLog(@"B");
还有这个:
dispatch_sync(dispatch_get_main_queue(), ^ {
NSLog(@"A");
});
NSLog(@"B");
据我所知,两种方式的输出都是 A 然后 B。因为同步是按照写入的顺序执行的。谢谢。
顾名思义,
dispatch_sync
可以同步要执行的任务,即使它们没有在主队列上执行。
Saheb Roy的回答只说了一半。您只能指定应在其上执行代码的调度队列。实际线程由 GCD 选择。
在并发队列上使用dispatch_async调度的代码块也以先进先出的方式执行,并保证按照您调度它们的顺序执行。 主要区别是串行队列上的dispatch_sync还可以保证在前一个代码块完成执行之前不会执行后面的代码块。
dispatch_sync
正在阻塞您当前的调度队列,即执行您的dispatch_sync 调用的队列。因此,您的调用函数将被阻塞,直到分派的代码块返回为止,而 dispatch_async
会立即返回。
在并发队列上使用 dispatch_async
的执行时间线可能如下所示:A 区 [........................]
B 区 [.....]
C 区 [....]
dispatch_sync
时,如下所示:A 区 [........................]
B 区 [.....]
C 区 [....]
dispatch_sync
队列的目的是,它将在您提到的线程中分派代码块,并且这些代码块将同步运行,这意味着在 FIFO 方法中一个接一个地运行,或者一个接一个地运行。 请查看
NSOperationQueue
以更好地了解 dispatch_sync
的功能