调度同步的目的是什么?

问题描述 投票:0回答:4

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

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

还有这个:

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

据我所知,两种方式的输出都是 A 然后 B。因为同步是按照写入的顺序执行的。谢谢。

ios objective-c asynchronous synchronous dispatch-async
4个回答
10
投票

顾名思义,

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 区                           [....]


1
投票
dispatch_sync

队列的目的是,它将在您提到的线程中分派代码块,并且这些代码块将同步运行,这意味着在 FIFO 方法中一个接一个地运行,或者一个接一个地运行。 请查看

NSOperationQueue
以更好地了解
dispatch_sync
的功能
    


0
投票
文档

将块提交到调度队列以同步执行。不像 dispatch_async,该函数直到块完成后才返回 完成的。调用此函数并定位当前队列 结果陷入僵局。

与dispatch_async不同,不对目标执行retain 队列。因为对该函数的调用是同步的,所以它“借用” 调用者的参考。此外,没有执行Block_copy 块。

作为一种优化,该函数调用当前的块 尽可能穿线。


-5
投票

© www.soinside.com 2019 - 2024. All rights reserved.