这一段怎么错了?让我们数一下方法:
对于任何不涉及 UI 的任务,您都可以在 GCD 中使用全局并发队列。
这是过于具体和不准确的。某些以 UI 为中心的任务,例如加载图像,可以在主线程之外完成。最好将其表述为“在大多数情况下,除了主线程之外,不要与UIKit
类交互”,但也有例外(例如,UIGraphicsContext
从 iOS 4、IIRC 开始,绘制到 a 是线程安全的,而绘制是 a CPU 密集型任务的一个很好的例子,可以卸载到后台线程。)FWIW,任何你可以提交到全局并发队列的工作单元,你也可以提交到私有并发队列。
这些允许同步或异步执行。但是同步执行并不意味着您的程序要等待代码完成才能继续。它只是意味着并发队列将等到您的任务完成,然后再继续队列中的下一个代码块。
正如 iWasRobbed 推测的那样,他们似乎将同步/异步工作提交与串行/并发队列混为一谈。根据定义,同步执行确实意味着您的程序在继续之前等待代码返回。根据定义,异步执行意味着您的程序不等待。类似地,串行队列一次只执行一个提交的工作单元,按 FIFO 顺序执行。并发队列,私有的或全局的,在一般情况下(在一秒钟内更多),按照它们入队的顺序,在一个或多个后台线程上调度提交的块以执行。使用的后台线程数是一个不透明的实现细节。
当您将块对象放在并发队列上时,您自己的程序总是会立即继续运行,而无需等待队列执行代码。
没有。不对。同样,他们混淆了同步/异步和串行/并发。我怀疑他们想说的是:当您将一个块异步排队时,您自己的程序总是会立即继续运行,而无需等待队列执行代码。
这是因为并发队列,顾名思义,在主线程以外的线程上运行它们的代码。
这也是不正确的。例如,如果你有一个私有并发队列,你用它作为读/写锁来保护一些可变状态,如果你dispatch_sync
从主线程到那个队列,你的代码在很多情况下会在主线程上执行线程。
总的来说,整个段落真的非常可怕和误导。
编辑:我在对另一个答案的评论中提到了这一点,但为了清楚起见,把它放在这里可能会有所帮助。“同步与异步调度”的概念和“串行与并发队列”的概念在很大程度上是正交的。您可以以同步或异步方式将工作分派到任何队列(串行或并发)。同步/异步二分法主要与“dispatch* er *”相关(因为它确定调度程序是否在块完成之前被阻塞),而串行/并发二分法主要与 dispatch* ee *相关块(因为它确定调度程序是否可能与其他块同时执行)。