一、概念解释
1、同步 :阻塞主线程,等执行完才能返回主线程。
2、异步:不阻塞主线程,提交线程后立马返回。
3、串行队列:按先进先出的顺序执行,等执行完第一个以后再执行第二个、第三个……
4、并行队列:按先进先出的顺序开始执行,无需等待上一个执行完,根据GCD的调度分配来决定执行的开始时间和速度。
二、使用详解
系统创建的队列:
主队列(串行队列) 获取:let mainQueue = DispatchQueue.main
全局队列(并行队列)获取:let globalQueue = DispatchQueue.global()
用户创建队列:
let serialQueue = DispatchQueue(label: "serialQueue")//创建串行队列
let concurrentQueue = DispatchQueue(label: "concurrentQueue", attributes: .concurrent)//创建并行队列
加入队列:
serialQueue.async {
//串行队列加入异步执行代码块
}
serialQueue.sync {
//串行队列加入同步执行代码块
}
concurrentQueue.async {
//并行队列加入异步执行代码块
}
concurrentQueue.sync {
//并行队列加入同步执行代码块
}
DispatchQueue.global().async {
//请求或处理数据,需要花费长时间的任务
DispatchQueue.main.async {
//更新ui,更改ui的操作必须在主线程进行
}
}
QoS,quality of service(服务等级)
User Interactive 和用户交互相关,比如动画等等优先级最高。比如用户连续拖拽的计算
User Initiated 需要立刻的结果,比如push一个ViewController之前的数据计算
Utility 可以执行很长时间,再通知用户结果。比如下载一个文件,给用户下载进度。
Background 用户不可见,比如在后台存储大量数据
指定QoS有两种方式:
1、创建一个指定QoS的队列
let qosQueue = DispatchQueue(label: "queueqos", qos: .background, attributes: .concurrent)
qosQueue.async {
//在QoS为background下运行
}
2、在提交代码块的时候指定QoS
serialQueue.async(qos: .background) {
//在QoS为background下运行
}
DispatchWorkItem
DispatchWorkItem 将任务封装成对象,然后提交
let item1 = DispatchWorkItem {
//任务代码块
}
let item2 = DispatchWorkItem(qos: .background, flags: [.enforceQoS]) {
//任务代码块
}
其中,flags类型为DispatchWorkItemFlags,参数有以下:
barrier ,detached, assignCurrentContext, noQoS(没有QoS), inheritQoS(继承Queue的QoS),enforceQoS(自己的QoS覆盖Queue的)
after,延迟执行
设定一个时间以后将任务加入到队列执行,目前建议只在主队列使用。
let delay = DispatchTime.now() + .seconds(1)
DispatchQueue.main.asyncAfter(deadline: delay) {
//延时1秒以后在主线程异步执行
}
DispatchSource后续学习补充
网友评论