创建DispatchQueue Swift3的方法有何不同

Ale*_*nko 3 grand-central-dispatch swift

我是斯威夫特的新秀,有这样的误解

如何创建调度队列有什么区别

样品1

let backgroundQueue = DispatchQueue(label: "com.app.queue",
                                qos: .background, 
                                target: nil)

backgroundQueue.async {
print("Dispatched to background queue")
}
Run Code Online (Sandbox Code Playgroud)

样本2

let backgroundQueue = DispatchQueue.global()
backgroundQueue.async {
print("Dispatched to background queue")
}
Run Code Online (Sandbox Code Playgroud)

据我所知,这两种方法都是一样的

或者例如这种方法

DispatchQueue.global(qos: .userInitiated).async {
print("user initiated task")
}
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

Rob*_*Rob 8

您在第一个示例中创建的队列是您自己的自定义串行队列.有点过时,但仍然相关的并发编程指南说:

串行队列(也称为专用调度队列)按照将它们添加到队列的顺序一次执行一个任务.当前正在执行的任务在由调度队列管理的不同线程(可能因任务而异)上运行.串行队列通常用于同步对特定资源的访问.

您可以根据需要创建任意数量的串行队列,并且每个队列与所有其他队列同时运行.换句话说,如果您创建四个串行队列,则每个队列一次只执行一个任务,但最多可以同时执行四个任务,每个队列一个.

而您的后一个示例仅使用检索系统提供的并发全局队列:

并发队列(也称为一种全局调度队列)同时执行一个或多个任务,但任务仍按其添加到队列的顺序启动.当前正在执行的任务在由调度队列管理的不同线程上运行.在任何给定点执行的任务的确切数量是可变的,取决于系统条件.

现在,您现在可以创建自己的自定义并发队列,但全局队列只是为我们创建的并发队列.

那么,这对你意味着什么?

  • 如果将块分派给串行队列(第一个示例),则任何时候只能运行一个块.这使得它在多线程应用程序中同步内存访问非常有用,但可以在需要后台队列的任何环境中使用,但是您希望调度块相对于该队列上的其他块串行(即顺序)运行.

  • 您在后面的示例中使用的全局队列是并发队列.这意味着如果将四个单独的任务分派给此全局队列,则这些块可以相互并发运行).这是理想的,您不仅需要后台执行,而且不关心这些块是否也与其他调度块同时运行.

  • 在后面的示例中,您正在访问全局队列,请认识到,因为这些是系统提供的,您对这些队列的交互有一些适度的限制,即:

    • 你不能暂停全局队列;

    • 你不能在全局队列上使用障碍;
       

    但是,尽管如此,如果您只是在寻找一种简单的方法来调度块在后台运行(并且您不关心这些调度块是否在同一时间运行),那么全局队列非常简单这样做的有效方法.


顺便说一下,你的第二个例子(我假设你想要的let backgroundQueue = DispatchQueue.global())和第三个例子之间的差别仅仅是在你的第三个例子中,你分配了明确的服务质量(qos),而在你的第二个例子中,你是'重新使用默认的qos.FWIW,通常建议指定一个qos,以便操作系统可以优先考虑争用有限系统资源的线程.