美文网首页
iOS - 串行队列

iOS - 串行队列

作者: Mn_Su | 来源:发表于2022-10-06 17:16 被阅读0次

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

  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中的几种多线程GCD1、GCD分为任务和队列,任务(同步,异步)队列(串行,并发),同步串行,同步主队列的情...

  • iOS串行队列

    //首先创建5个串行队列dispatch_queue_t serialQueue1 = dispatch_queu...

  • iOS - 串行队列

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

  • iOS开发之GCD并发队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 03 ...

  • iOS开发多线程之GCD

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 GCD...

  • iOS开发之GCD同步任务加强

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 004...

  • iOS开发之GCD串行队列

    iOS开发多线程之GCDiOS开发之GCD同步任务加强iOS开发之GCD串行队列iOS开发之GCD并发队列 实例d...

  • 谈谈队列和多线程的使用原理

    在iOS中队列分为以下几种: 串行队列:队列中的任务只会顺序执行; dispatch_queue_tq = dis...

  • 队列和线程

    [iOS多线程中,队列和执行的排列组合结果分析] 多线程中的队列有:串行队列,并发队列,全局队列,主队列。 执行的...

  • iOS底层原理——浅谈多线程

    iOS-浅谈多线程 一、造成线程堵塞的条件: 1、当前串行队列有任务。2、在这个任务中使用同步函数给当前串行队列添...

网友评论

      本文标题:iOS - 串行队列

      本文链接:https://www.haomeiwen.com/subject/bdamartx.html