了解调度队列线程

时间:2018-11-26 22:00:18

标签: ios swift grand-central-dispatch

我正在一个项目中,该项目从数据库中收集(1000多个)数据点,并每隔几秒钟更新一次。为了防止主线程被锁定,我必须在后台线程中读取,排序和保存数据。我想了解两个后台调用之间的区别。

在此article中,作者为我们提供了使用这样的后台线程的好例子:DispatchQueue(label: "foo", qos: .utility).async {}

在此站点的另一个example中,我找到了DispatchQueue扩展名的一个很好的例子。这个不使用标签。

我知道这两种方法是不同的,但是精确度如何(除了一个是扩展名)?第二个问题:最佳做法是等待后台线程活动完成工作然后再调用它吗?还是有关系吗?

2 个答案:

答案 0 :(得分:2)

您自己创建的调度队列(第一个示例)与内置的global调度队列(第二个示例)之间的唯一表面区别是前者是串行的(默认情况下)而后者是并发的。

  

第二个问题:等待是否是最佳实践

“永远”有权“等”。如果您需要协调多个任务,则可以使用GCD来完成(例如调度组)。

答案 1 :(得分:0)

我对matt said(+1)的所有内容表示100%的同意。

另外一些观察结果:

  1. 正如他所说,主要区别在于全局队列是并发队列,而当您创建队列时,它默认为串行队列。例如。这是一个串行队列:

    let queue = DispatchQueue(label: "foo", qos: .utility)
    

    您当然可以创建自己的并发队列:

    let queue = DispatchQueue(label: "foo", qos: .utility, attributes: .concurrent)
    
  2. 让我们假设一秒钟,您决定确实要使用并发队列。这就引出了一个问题,为什么要创建自己的命名自定义并发队列而不是使用全局队列之一。有几个原因:

    • 在Xcode和Instruments中进行调试时,您可以看到自定义队列名称。例如。这是一个断点,在这里我可以看到我的断点在哪个队列上(以及该队列也在使用哪些其他线程):

      enter image description here

    • 某些更高级的技术(例如障碍)无法在全局队列上执行。对于那些狭窄的应用程序集合,您可能想要使用自己的自定义并发队列。