调度同步的目的是什么?

时间:2015-09-02 08:09:34

标签: ios objective-c asynchronous synchronous dispatch-async

我很清楚dispatch_async队列正在执行什么,但我不清楚dispatch_sync的用途是什么。举个例子:这有什么区别:

NSLog(@"A");
NSLog(@"B");

和本:

dispatch_sync(dispatch_get_main_queue(), ^ {
NSLog(@"A");
    });
NSLog(@"B");

正如我所知,在两种方式中输出将是A然后是B.因为同步是按照写入的顺序执行的。感谢。

4 个答案:

答案 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更新中运行,以避免屏幕阻塞。