在GCD中,有两种方法可以同时运行块。
我可以使用其中一个全局池:
DispatchQueue.global().async() {
// do work
}
或者我可以创建自己的队列:
let queue = DispatchQueue(label: "process images", attributes: [.concurrent])
queue.async {
// do work
}
但我找不到太多关于何时偏爱一个而不是另一个的信息。
有些地方(包括来自libdispatch维护者的邮件列表帖子摘要(建议你真的不应该使用全局队列。
然而,大多数代码示例只是调度到全局队列,甚至有一些来源说你真的不应该使用自定义队列 - 而应该更喜欢全局队列。
哪种情况更适合每种队列?有点相关的是,一些文章建议更喜欢串行队列而不是并发队列 - 但显然它们具有完全不同的并行特性,因此将它们建议为可互换的很奇怪。
除了担心效率和线程爆炸之外,使用您自己的并发队列,您还可以:
- 指定对调试有意义的标签
- 暂停它
- 设置和获取特定于应用的数据
- 提交障碍任务
对于全局并发队列,这些都是不可能的。