美文网首页
GCD使用详解(swift版)

GCD使用详解(swift版)

作者: 有虫吃 | 来源:发表于2018-04-11 10:32 被阅读0次

一、概念解释

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后续学习补充

相关文章

网友评论

      本文标题:GCD使用详解(swift版)

      本文链接:https://www.haomeiwen.com/subject/svenhftx.html