GCD源码分析之全局线程优先级

获取全局队列

DISPATCH_EXPORT DISPATCH_CONST DISPATCH_WARN_RESULT DISPATCH_NOTHROW
dispatch_queue_t
dispatch_get_global_queue(long identifier, unsigned long flags);

获取全局队列时,系统对外提供了 5 个级别的优先级

// 服务于与用户交互的优先级,该级别任务会占用几乎所有的时间片和 I/O 带宽。可以进行处理主事件循环、视图绘制、动画等操作,
 *  - QOS_CLASS_USER_INTERACTIVE
// 服务于用户发起并等待的优先级 
 *  - QOS_CLASS_USER_INITIATED
// 默认的优先级
 *  - QOS_CLASS_DEFAULT
// 用户不太关心任务的进度,但是需要知道结果,比如下拉刷新操作
 *  - QOS_CLASS_UTILITY
// 用户不会察觉的任务,比如,预加载一些数据,
 *  - QOS_CLASS_BACKGROUND

DISPATCH_QUEUE_PRIORITY 和 QOS_CLASS 的对应关系如下所示:

 *  - DISPATCH_QUEUE_PRIORITY_HIGH:         QOS_CLASS_USER_INITIATED
 *  - DISPATCH_QUEUE_PRIORITY_DEFAULT:      QOS_CLASS_DEFAULT
 *  - DISPATCH_QUEUE_PRIORITY_LOW:          QOS_CLASS_UTILITY
 *  - DISPATCH_QUEUE_PRIORITY_BACKGROUND:   QOS_CLASS_BACKGROUND

获取队列优先级

__OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0)
DISPATCH_EXPORT DISPATCH_WARN_RESULT DISPATCH_NONNULL1 DISPATCH_NOTHROW
dispatch_qos_class_t
dispatch_queue_get_qos_class(dispatch_queue_t queue,
  int *relative_priority_ptr);

获取队列优先级的结果比上面多个一种结果:

QOS_CLASS_UNSPECIFIED

如果这个队列是由 dispatch_queue_attr_make_with_qos_class() 返回的属性创建的,则返回创建时使用的优先级。其它的任何属性都会返回 QOS_CLASS_UNSPECIFIED

dispatch_queue_attr_make_with_qos_class 的用法如下:

 dispatch_queue_t queue;
 dispatch_queue_attr_t attr;
 attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL,
   QOS_CLASS_UTILITY, 0);
 queue = dispatch_queue_create("com.example.myqueue", attr);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容