调度同步的目的是什么?
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_sync
queue 的目的是它会在您提到的线程中分派代码块,并且会 运行 同步,这意味着一个接一个,或者更确切地说,一个接一个地在 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 [....]
我很清楚 dispatch_async 队列在执行什么,但我不清楚 dispatch_sync 的目的是什么。例如:这之间有什么区别:
NSLog(@"A");
NSLog(@"B");
还有这个:
dispatch_sync(dispatch_get_main_queue(), ^ {
NSLog(@"A");
});
NSLog(@"B");
据我所知,两种方式的输出都是 A,然后是 B。因为同步是按照写入的顺序执行的。谢谢
dispatch_sync
queue 的目的是它会在您提到的线程中分派代码块,并且会 运行 同步,这意味着一个接一个,或者更确切地说,一个接一个地在 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 [....]