GCD API讲解<三>

1 篇文章 0 订阅

dispatch_set_target_queue

变更生成的Dispatch Queue的执行优先级

dispatch_queue_create生成的Dispatch Queue不管是Serial Dispatch Queue还是Concurrent Dispatch Queue,都使用与默认优先级Global Dispatch Queue相同的执行优先级的线程.而变更生成的Dispatch Queue的执行优先级要使用dispatch_set_target_queue函数.在后台执行动作处理的Serial Dispatch Queue的生成方法如下:

dispatch_queue_t mySerialDispatchQueue = dispatch_queue_create("com.example.gcd.mySerialDispatchQueue", NULL);
    dispatch_queue_t globalDispatchQueueBackground = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    dispatch_set_target_queue(mySerialDispatchQueue, globalDispatchQueueBackground);

指令要变更执行优先优先级的Dispatch Queue为dispatch_set_target_queue函数的第一个参数,指定与要使用的执行优先级相同优先级的Global Dispatch Queue 为第二个参数(目标).第一个参数如果指定系统提供的Main Dispatch Queue 和 Global Dispatch Queue 则不知道会出现什么状况,因此这些均不可指定.

将Dispatch Queue 指定为dispatch_set_target_queue函数的参数,不仅可以变更Dispatch Queue 的执行优先级,还可以作成Dispatch_queue的执行阶层.如果在多个Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为摸一个Serial Dispatch Queue,那么原本应该并行执行的多个Serial Dispatch Queue,在目标Serial Dispatch Queue上只能同时执行一个处理.

在必须将不可并行执行的处理追加到多个Serial Dispatch Queue 中时,如果使用dispatch_set_target_queue函数将目标指定为某一个Serial Dispatch Queue,既可防止处理并行执行.

//例:
dispatch_queue_t serial = dispatch_queue_create("com.gcd.serial1", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t serial2 = dispatch_queue_create("com.gcd.serial2", DISPATCH_QUEUE_SERIAL);
//    dispatch_set_target_queue(serial2, serial);
    dispatch_queue_t serial3 = dispatch_queue_create("com.gcd.serial3", DISPATCH_QUEUE_SERIAL);
//    dispatch_set_target_queue(serial3, serial);
    dispatch_queue_t serial4 = dispatch_queue_create("com.gcd.serial4", DISPATCH_QUEUE_SERIAL);
//    dispatch_set_target_queue(serial4, serial);


    dispatch_async(serial2, ^{
        sleep(2);
        NSLog(@"2");
    });
    dispatch_async(serial4, ^{
        sleep(2);
        NSLog(@"4");
    });
    dispatch_async(serial3, ^{
        sleep(2);
        NSLog(@"3");
    });
执行结果:
2017-08-15 17:06:29.897 GCDDemo[17002:3581660] 4
2017-08-15 17:06:29.897 GCDDemo[17002:3581685] 2
2017-08-15 17:06:29.897 GCDDemo[17002:3581662] 3

    dispatch_queue_t serial = dispatch_queue_create("com.gcd.serial1", DISPATCH_QUEUE_SERIAL);

    dispatch_queue_t serial2 = dispatch_queue_create("com.gcd.serial2", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(serial2, serial);
    dispatch_queue_t serial3 = dispatch_queue_create("com.gcd.serial3", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(serial3, serial);
    dispatch_queue_t serial4 = dispatch_queue_create("com.gcd.serial4", DISPATCH_QUEUE_SERIAL);
    dispatch_set_target_queue(serial4, serial);


    dispatch_async(serial2, ^{
        sleep(2);
        NSLog(@"2");
    });
    dispatch_async(serial4, ^{
        sleep(2);
        NSLog(@"4");
    });
    dispatch_async(serial3, ^{
        sleep(2);
        NSLog(@"3");
    });
执行结果:
2017-08-15 17:07:58.357 GCDDemo[17030:3592320] 2
2017-08-15 17:08:00.357 GCDDemo[17030:3592320] 4
2017-08-15 17:08:02.359 GCDDemo[17030:3592320] 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值