iOS关于Dispatch优先级

我们一般在使用异步队列处理耗时操作的时候会这样

DispatchQueue.global(qos: .userInitiated).async {
    //do something
}

而使用到的qos既DispatchQoS(Dispatch Quality of Service),这个就是表示优先级的类。系统使用QoS信息来进行优先级的调度。

常用的优先级有以下的一些(参考):

QoS类别 QoS的工作类型和重点 等待执行的时间
userInteractive 与用户进行交互的动作,例如:在主线程操作,刷新用户界面,或者执行动画。如果动作没有很快的发生,用户界面就会明显的卡顿。重点在于响应性和性能 在瞬间执行
userInitiated 用户发起的动作需要立即得到结果,例如:正在打开一个保存的文档或执行一个用户点击用户界面的动作。为了用户后续的工作,需要进行这个工作。重点在于响应性和性能 几乎是在瞬间执行,例如几秒钟或者更少
utility 可能需要一些时间才能完成的操作,不是立即需要结果的,例如:下载或者导入数据。utility任务一般有一个进度条让用户能看到。重点是在响应性和性能以及能源效率之间提供一个平衡 可能需要几秒或者几分钟
background 在后台操作并且不需要用户看见的工作,例如:索引,同步操作和备份等。重点在能源效率 工作要很长的时间,例如多少分钟或多少小时

(注:在Low Power Mode即低电量模式开启时后台操作包括网络请求将被暂停)

除了上面介绍了4种优先级,还有2种特殊的优先级,在大部分情况下我们都不会接触或使用的这2种优先级,但是它们的存在还是有意义的,如下:

QoS类别 描述
default 它的优先级在userInitiated和utility之间,这个类别并不打算给开发人员进行分类工作。没有被赋值QoS的都会被默认为这个级别,并且GCD全局队列就是运行在这个类别下
unspecified 它表示当前没有QoS信息,系统应该根据环境自动推断QoS信息。如果使用遗弃的API,线程有可能会脱离QoS,这个时候,线程就是unspecified QoS类别的

所以最后给这些优先级做个排序的话:

userInteractive > userInitiated > default > utility > background

最后博客转到这里了

你可能感兴趣的:(iOS关于Dispatch优先级)