iOS8 GCD多线程新特性QoS 设置队列优先级

本文详细介绍了iOS8中GCD多线程的新特性QoS(Quality of Service),包括不同服务质量等级的应用场景及如何设置队列优先级,还探讨了自定义队列优先级的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 iOS8 GCD多线程新特性QoS 设置队列优先级


Quality of Service(QoS)

这是在iOS8之后提供的新功能,苹果提供了几个Quality of Service枚举来使用:user interactive, user initiated, utility background,通过这告诉系统我们在进行什么样的工作,然后系统会通过合理的资源控制来最高效的执行任务代码,其中主要涉及到CPU调度的优先级、IO优先级、任务运行在哪个线程以及运行的顺序等等,我们通过一个抽象的Quality of Service参数来表明任务的意图以及类别。


GCD默认已经提供了全局的并发队列供整个应用使用,所以可以不用手动创建。

      创建全局队列的函数为

dispatch_queue_t q = dispatch_get_global_queue(long identifier, unsigned long flags)


  参数类型为:

long identifierios 8.0 告诉队列执行任务的“服务质量 quality of service”,系统提供的参数有:


     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,                    未指定

     iOS 7.0 之前 优先级

     DISPATCH_QUEUE_PRIORITY_HIGH 2                 高优先级

     DISPATCH_QUEUE_PRIORITY_DEFAULT 0              默认优先级

     DISPATCH_QUEUE_PRIORITY_LOW (-2)               低优先级

     DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN  后台优先级


    BACKGROUND表示用户不需要知道任务什么时候完成,如果选择这个选项速度慢得令人发指,非常不利于调试!对于优先级推荐不要搞得太负责,就用最简单,以免发生优先级反转。

     

    unsigned long flags:苹果官方文档是这样解释的: Flags that are reserved for future use。标记是为了未来使用保留的!所以这个参数应该永远指定为0


自定义队列的优先级:可以通过

dipatch_queue_attr_make_with_qos_class dispatch_set_target_queue方法设置队列的优先级

//dipatch_queue_attr_make_with_qos_class

dispatch_queue_attr_t attr = dispatch_queue_attr_make_with_qos_class(DISPATCH_QUEUE_SERIAL, QOS_CLASS_UTILITY, -1);

dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.qosqueue", attr);


//dispatch_set_target_queue

dispatch_queue_t queue = dispatch_queue_create("com.starming.gcddemo.settargetqueue",NULL); //需要设置优先级的queue

dispatch_queue_t referQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0); //参考优先级

dispatch_set_target_queue(queue, referQueue); //设置queuereferQueue的优先级一样

dispatch_set_target_queue:可以设置优先级,也可以设置队列层级体系,比如让多个串行和并行队列在统一一个串行队列里串行执行,如下

dispatch_queue_t serialQueue = dispatch_queue_create("com.starming.gcddemo.serialqueue", DISPATCH_QUEUE_SERIAL);

dispatch_queue_t firstQueue = dispatch_queue_create("com.starming.gcddemo.firstqueue", DISPATCH_QUEUE_SERIAL);

dispatch_queue_t secondQueue = dispatch_queue_create("com.starming.gcddemo.secondqueue", DISPATCH_QUEUE_CONCURRENT);


dispatch_set_target_queue(firstQueue, serialQueue);

dispatch_set_target_queue(secondQueue, serialQueue);


dispatch_async(firstQueue, ^{

    NSLog(@"1");

    [NSThread sleepForTimeInterval:3.f];

});

dispatch_async(secondQueue, ^{

    NSLog(@"2");

    [NSThread sleepForTimeInterval:2.f];

});

dispatch_async(secondQueue, ^{

    NSLog(@"3");

    [NSThread sleepForTimeInterval:1.f];

});


参考内容:

http://subscribe.mail.10086.cn/subscribe/readAll.do?columnId=563&itemId=3130310

http://www.jianshu.com/p/f9e01c69a46f

http://www.cnblogs.com/jinciyisheng/p/5645715.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值