多线程之GCD

2018-04-27  本文已影响0人  杰森斯坦sen

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优先级从高到低有:

主队列默认拥有更高的优先级。
全局队列默认优先级是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

上一篇 下一篇

猜你喜欢

热点阅读