当App需要进行计算量较大或耗时较长的工作时,多线程计算就必不可少。iOS为我们提供了一个比较方式的异步任务工具类——GCD。
GCD类似于一个线程池。我们设置好对应的模式,然后将任务放入等待队列即可。
一个存放任务的数据结构,队列遵循FIFO模式。队列分为并行队列和串行队列。
// 创建了一个标签是”queue0“、执行优先级为.default的并行队列
let queue0 = DispatchQueue(label: "queue0", qos: .default, attributes: .concurrent)
// label:队列标签
// qos:设置队列的优先级
// attributes:队列形式:默认串行,设置为.concurrent代表是并行队列
let queue2 = DispatchQueue(label: "queue2")
let queue1 = DispatchQueue(label: "queue1", attributes: .concurrent)
系统也为我们提供了一个公共的并行队列,获取方式:
DispatchQueue.global()
此外,主线程就是一个串行队列。
DispatchQueue.main
任务就是一个代码块,用来实现我们需要的计算逻辑。我们使用时,将其放入队列中执行。
// 同步执行
queue1.sync {
for i in 100...110 {
print("?\(i)")
}
print("1:\(Thread.current)")
}
// 异步执行
queue1.async {
for i in 1000...1010 {
print("?\(i)")
}
print("1:\(Thread.current)")
}
GCD运行方式
当我们需要进行精确的任务先后关系控制时,我们可以用DispathWorkIten来实现。
// 队列1
let queue1 = DispatchQueue(label: "queue1")
// 任务1
let work1 = DispatchWorkItem {
for i in 1...10 {
print("?\(i)")
}
print("1:\(Thread.current)")
}
// 任务2
let work2 = DispatchWorkItem {
for i in 1000...1010 {
print("?\(i)")
}
print("2:\(Thread.current)")
}
// 第一种绑定方式
work1.notify(queue: queue1) {
// 执行2
work2.perform()
}
// 第二中绑定方式
work1.notify(queue: queue1, execute: work2)
// 第三种可以直接不创建work2,在闭包中执行work的工作
work1.notify(queue: queue1) {
for i in 1000...1010 {
print("?\(i)")
}
print("2:\(Thread.current)")
}
// 执行任务:
// 方式1:任务放在队列中并执行
queue1.async(execute: work1)
// 方式2:如果不指定队列,会在当前的队列中执行,如果在主线程中执行会造成线程阻塞
work1.perform()
如有问题,欢迎指正。