iOS - 串行队列

背景:开发人员在需要开启线程处理任务时,大多都采用了全局队列默认优先级来处理,所以项目中积累了大量的全局队列默认优先级,导致了一人干活,全家围观。

  1. 项目中通常采取的都是异步主队列操作或者异步全局队列操作,却并未涉及到创建同步队列;查阅Apple文档后发现dispatch_queue_attr_t属性,可以用来创建同步队列,然后再去异步或者同步执行线程;

  2. 异步主队列操作:
    dispatch_async(dispatch_get_main_queue(), ^{});

  3. 异步全局队列操作:
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{});

  4. 异步同步队列:
    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, ^{});

  5. 为解决背景问题,我们设定不同的优先级,创建与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);
}

你可能感兴趣的:(iOS - 串行队列)