我很清楚dispatch_async队列正在执行什么,但我不清楚dispatch_sync的用途是什么。举个例子:这有什么区别:
NSLog(@"A");
NSLog(@"B");
和本:
dispatch_sync(dispatch_get_main_queue(), ^ {
NSLog(@"A");
});
NSLog(@"B");
正如我所知,在两种方式中输出将是A然后是B.因为同步是按照写入的顺序执行的。感谢。
答案 0 :(得分:3)
正如名称所说dispatch_sync
使得即使它们没有在主队列上执行也可以同步要执行的任务。
Saheb Roy's回答只是事实的一半。您只能指定应在其上执行代码的调度队列。实际线程由GCD选择。
在并发队列中使用dispatch_async调度的代码块也以FIFO方式执行,并保证按照您调度它们的顺序执行。 主要区别是串行队列上的dispatch_sync还可以保证在上一个块完成执行之前不执行以下代码块。 dispatch_sync
阻止当前的调度队列,即执行dispatch_sync调用的队列。所以你的调用函数被阻塞,直到调度的代码块返回,而dispatch_async
立即返回。
在并发队列上使用dispatch_async
的执行时间表我看起来像这样:
A座[..............]
B座[.....]
C座[....]
在串行队列上使用dispatch_sync
时如下所示:
A座[..............]
B座[.....]
C座[....]
答案 1 :(得分:1)
dispatch_sync
队列的目的是它将在你提到的线程中调度代码块,并且它将同步运行,这意味着在FIFO方法中逐个或者一个接一个地运行。
请查看NSOperationQueue
以便更好地了解dispatch_sync
的功能
答案 2 :(得分:1)
根据Docs
将一个块提交到调度队列以进行同步执行。不像 dispatch_async,此函数在块有效之前不会返回 完了。调用此函数并定位当前队列 导致陷入僵局。
与dispatch_async不同,不对目标执行保留 队列。因为对此函数的调用是同步的,所以它“借用” 来电者的参考。而且,没有执行Block_copy 块。
作为优化,此函数调用当前的块 尽可能的线程。
答案 3 :(得分:-4)
它的目的是进行多任务处理。两个或多个进程同时在后台线程中运行一个,在主线程中运行另一个。这个过程主要是在主线程中的后台线程和UI更新中运行,以避免屏幕阻塞。