GCD的队列分为串行队列和并行队列两类:
串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。
并发队列:有多个线程,操作进来之后它会将这些队列安排在可用的处理器上,同时保证先进来的任务优先处理。
串行队列
使用串行队列时首先要创建一个串行队列,然后调用异步调用方法。
let serialQueue = DispatchQueue(label: "serialQueue")
并行队列
使用串行队列时首先要创建一个串行队列,然后调用异步调用方法。
let concurrentQueue = DispatchQueue(label: "concurrentQueue", qos: .utility, attributes: .concurrent)
concurrentQueue.async {
}
在实际开发中我们通常使用DispatchQueue.global()方法取得一个全局的并行队列。
DispatchQueue.global().async {
DispatchQueue.main.async {
// 更新UI操作
}
}
attributes 参数也可以接受.initiallyInactive 的值。这样任务不会被自动执行,而是需要手动去触发。默认是串行队列,如果需要并行队列,需要attributes参数填加.concurrent。
let anotherQueue = DispatchQueue(label: "anotherQueue", qos: .utility, attributes: .initiallyInactive)
if let queue = inactiveQueue {
queue.activate()
}
QoS
上面初始化DispatchQueue时我们用了qos参数,用于指定任务重要程度以及优先级的信息。
Apple定义的QoS优先级从高到低有:
- userInteractive
- userInitiated
- default
- utility
- background
- unspecified
主队列默认拥有更高的优先级。
全局队列默认优先级是default,也可以修改优先级,但是不建议这样做。
let globalQueue = DispatchQueue.global(qos: .userInitiated)
主队列和全局队列
主队列和全局队列是系统定义的队列,也是我们最常用的队列。
主队列是作为更新 UI 而使用。
DispatchQueue.main.async {
// 更新UI操作
}
全局队列是系统定义的并行队列,上面并行队列中有介绍过。
DispatchWorkItem
DispatchWorkItem 是一个代码块,它可以在任意一个队列上执行,因此它里面的代码可以在后台运行,也可以在主线程运行。
当一个任务项被调用后,你可以通知主队列或者其他队列。
let workItem = DispatchWorkItem {
// Do something
}
let queue = DispatchQueue.global()
queue.async(execute: workItem)
workItem.notify(queue: DispatchQueue.main) {
// Do something
}
链接
A deep dive into Grand Central Dispatch in Swift
Swift 3 中的 GCD 与 Dispatch Queue
网友评论