我正在一个项目中,该项目从数据库中收集(1000多个)数据点,并每隔几秒钟更新一次。为了防止主线程被锁定,我必须在后台线程中读取,排序和保存数据。我想了解两个后台调用之间的区别。
在此article中,作者为我们提供了使用这样的后台线程的好例子:DispatchQueue(label: "foo", qos: .utility).async {}
在此站点的另一个example中,我找到了DispatchQueue
扩展名的一个很好的例子。这个不使用标签。
我知道这两种方法是不同的,但是精确度如何(除了一个是扩展名)?第二个问题:最佳做法是等待后台线程活动完成工作然后再调用它吗?还是有关系吗?
答案 0 :(得分:2)
您自己创建的调度队列(第一个示例)与内置的global
调度队列(第二个示例)之间的唯一表面区别是前者是串行的(默认情况下)而后者是并发的。
第二个问题:等待是否是最佳实践
“永远”有权“等”。如果您需要协调多个任务,则可以使用GCD来完成(例如调度组)。
答案 1 :(得分:0)
我对matt said(+1)的所有内容表示100%的同意。
另外一些观察结果:
正如他所说,主要区别在于全局队列是并发队列,而当您创建队列时,它默认为串行队列。例如。这是一个串行队列:
let queue = DispatchQueue(label: "foo", qos: .utility)
您当然可以创建自己的并发队列:
let queue = DispatchQueue(label: "foo", qos: .utility, attributes: .concurrent)
让我们假设一秒钟,您决定确实要使用并发队列。这就引出了一个问题,为什么要创建自己的命名自定义并发队列而不是使用全局队列之一。有几个原因: