iOS关于Dispatch优先级
2018-03-02 本文已影响15人
CxDtreeg
我们一般在使用异步队列处理耗时操作的时候会这样
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
最后博客转到这里了