背景:开发人员在需要开启线程处理任务时,大多都采用了全局队列默认优先级来处理,所以项目中积累了大量的全局队列默认优先级,导致了一人干活,全家围观。
项目中通常采取的都是异步主队列操作或者异步全局队列操作,却并未涉及到创建同步队列;查阅Apple文档后发现dispatch_queue_attr_t属性,可以用来创建同步队列,然后再去异步或者同步执行线程;
异步主队列操作:
dispatch_async(dispatch_get_main_queue(), ^{});
异步全局队列操作:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});
异步同步队列:
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, -1);
dispatch_queue_t queue = dispatch_queue_create("com.lotus.LCQueueForUserInteractive", attr);
dispatch_async(attr, ^{});
为解决背景问题,我们设定不同的优先级,创建与CPU核数相等的串行队列,通过优先级的合理使用和串行队列的调度,充分利用时间片和多核的效率,同时不出现相关副作用的情况下实现多线程操作。
QOS_CLASS_USER_INTERACTIVE 0x21, 用户交互(希望尽快完成,用户对结果很期望,不要放太耗时操作)
QOS_CLASS_USER_INITIATED 0x19, 用户期望(不要放太耗时操作)
QOS_CLASS_DEFAULT 0x15, 默认(不是给程序员使用的,用来重置对列使用的)
QOS_CLASS_UTILITY 0x11, 实用工具(耗时操作,可以使用这个选项)
QOS_CLASS_BACKGROUND 0x09, 后台
QOS_CLASS_UNSPECIFIED 0x00, 未指定
*/
/// 与用户交互的任务,这些任务通常跟UI级别的刷新相关,比如动画,cell高度,frame等UI的计算
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUserInteractive(void){
// 自定义队列的优先级 <创建串行队列,通过优先级的合理使用和串行队列的调度,充分利用时间片和多核的效率>
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INTERACTIVE, -1);
return dispatch_queue_create("com.lotus.LCQueueForUserInteractive", attr);;
}
/// 由用户发起的并且需要立即得到结果的任务,比如读取数据(配置,用户信息等)来加载UI,会在几秒或者更短的时间内完成
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUserInitiated(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_USER_INITIATED, -1);
return dispatch_queue_create("com.lotus.LCQueueForUserInitiated", attr);;
}
/// 一些耗时的任务,比如复杂的组合的网络请求,图片下载,上传
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForUtility(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);
return dispatch_queue_create("com.lotus.LCQueueForUtility", attr);;
}
/// 对用户不可见,可以长时间在后台运行,比如,拉取配置,地理位置上报,日志上报等
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForBackground(void){
dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_BACKGROUND, -1);
return dispatch_queue_create("com.lotus.LCQueueForBackground", attr);;
}
/// 默认,不推荐作为首选使用
UIKIT_STATIC_INLINE dispatch_queue_t LCQueueForDefault(void){
return dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
}