调度同步的目的是什么?

What is purpose of dispatch sync?

我很清楚 dispatch_async 队列在执行什么,但我不清楚 dispatch_sync 的目的是什么。例如:这之间有什么区别:

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

还有这个:

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

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

dispatch_syncqueue 的目的是它会在您提到的线程中分派代码块,并且会 运行 同步,这意味着一个接一个,或者更确切地说,一个接一个地在 FIFO 中方法。 请查看 NSOperationQueue 以更好地了解 dispatch_sync 的功能

根据Docs

Submits a block to a dispatch queue for synchronous execution. Unlike dispatch_async, this function does not return until the block has finished. Calling this function and targeting the current queue results in deadlock.

Unlike with dispatch_async, no retain is performed on the target queue. Because calls to this function are synchronous, it "borrows" the reference of the caller. Moreover, no Block_copy is performed on the block.

As an optimization, this function invokes the block on the current thread when possible.

它的目的是多任务处理。 .同时有两个或多个进程运行,一个在后台线程,另一个在主线程。 .主要是后台线程中的进程 运行 和主线程中的 UI 更新以避免屏幕阻塞。

顾名思义,dispatch_sync可以同步要执行的任务,即使它们不在主队列上执行。

Saheb Roy's 答案只对了一半。您只能指定应在其上执行代码的调度队列。实际线程由 GCD 选择。

在并发队列上使用 dispatch_async 调度的代码块也以 FIFO 方式执行,并保证按照您调度它们的顺序执行。 主要区别 是串行队列上的 dispatch_sync 还保证您在前一个代码块完成执行之前不会执行后续代码块。 dispatch_sync 正在阻塞您当前的调度队列,即执行您的 dispatch_sync 调用的队列。所以你的调用函数被阻塞,直到调度代码块 returns 而 dispatch_async returns 立即。

在并发队列上使用 dispatch_async 的执行时间线我看起来像这样:

区块 A [................]
B 块 [.....]
C 区 [....]

在串行队列上使用 dispatch_sync 时如下所示:

区块 A [................]
B 块 [.....]
Block C [....]