我正在努力完全理解 GCD 中的并发和串行队列。我有一些问题,希望有人能清楚、中肯地回答我。
我读到串行队列的创建和使用是为了一个接一个地执行任务。但是,如果发生以下情况会怎样:
- 我创建一个串行队列
- 我使用
dispatch_async
(在我刚刚创建的串行队列上)三次来分派(dispatch)三个 block A、B、C
三个block会不会被执行:
顺序是A,B,C,因为队列是串行的
或
- 并发(同时在并行线程上)因为我使用了 ASYNC 分派(dispatch)
我读到我可以在并发队列上使用
dispatch_sync
以便一个接一个地执行 block 。在那种情况下,为什么串行队列甚至存在,因为我总是可以使用并发队列,在那里我可以根据需要同步分派(dispatch)尽可能多的 block ?感谢任何好的解释!
最佳答案
一个简单的例子:你有一个 block 需要一分钟来执行。您将它从主线程添加到队列中。让我们来看看这四种情况。
- 异步 - 并发:代码在后台线程上运行。控制立即返回到主线程(和 UI)。该 block 不能假定它是该队列上运行的唯一 block
- 异步 - 串行:代码在后台线程上运行。控制立即返回到主线程。该 block 可以假定它是该队列上运行的唯一 block
- sync - 并发:代码在后台线程上运行,但主线程等待它完成,阻止对 UI 的任何更新。该 block 不能假定它是该队列上运行的唯一 block (我可以在几秒钟前使用异步添加另一个 block )
- 同步 - 串行:代码在后台线程上运行,但主线程等待它完成,阻止对 UI 的任何更新。该 block 可以假定它是该队列上运行的唯一 block
显然,对于长时间运行的进程,您不会使用最后两个中的任何一个。当您尝试从可能在另一个线程上运行的内容更新 UI(总是在主线程上)时,您通常会看到它。
关于ios - GCD 中的并发队列与串行队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19179358/