美文网首页
iOS 多线程-GCD 之dispatch_set_target

iOS 多线程-GCD 之dispatch_set_target

作者: TaoGeNet | 来源:发表于2020-02-21 00:30 被阅读0次
    dispatch_set_target_queue(dispatch_object_t object, dispatch_queue_t queue);
    

    dispatch_set_target_queue 函数有两个作用:第一,变更队列的执行优先级;第二,目标队列可以成为原队列的执行阶层。

    第一个参数是要执行变更的队列(不能指定主队列和全局队列)
    第二个参数是目标队列

    变更优先级

    //优先级变更的串行队列,初始是默认优先级
    dispatch_queue_t serialQueue = dispatch_queue_create("com.gcd.setTargetQueue.serialQueue", NULL);
    
    //优先级不变的串行队列(参照),初始是默认优先级
    dispatch_queue_t serialDefaultQueue = dispatch_queue_create("com.gcd.setTargetQueue.serialDefaultQueue", NULL);
    
    //变更前
    dispatch_async(serialQueue, ^{
        NSLog(@"1");
    });
    dispatch_async(serialDefaultQueue, ^{
        NSLog(@"2");
    });
    
    //获取优先级为后台优先级的全局队列
    dispatch_queue_t globalDefaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
    //变更优先级
    dispatch_set_target_queue(serialQueue, globalDefaultQueue);
    
    //变更后
    dispatch_async(serialQueue, ^{
        NSLog(@"1");
    });
    dispatch_async(serialDefaultQueue, ^{
        NSLog(@"2");
    });
    
    2017-02-28 21:06:03.474 GCDLearn[1108:53387] 1
    2017-02-28 21:06:03.474 GCDLearn[1108:53396] 2
    2017-02-28 21:06:03.474 GCDLearn[1108:53396] 2
    2017-02-28 21:06:03.475 GCDLearn[1108:53401] 1
    

    设置执行层

    dispatch_queue_t serialQueue1 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue1", NULL);
    dispatch_queue_t serialQueue2 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue2", NULL);
    dispatch_queue_t serialQueue3 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue3", NULL);
    dispatch_queue_t serialQueue4 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue4", NULL);
    dispatch_queue_t serialQueue5 = dispatch_queue_create("com.gcd.setTargetQueue2.serialQueue5", NULL);
    
    dispatch_async(serialQueue1, ^{
        NSLog(@"1");
    });
    dispatch_async(serialQueue2, ^{
        NSLog(@"2");
    });
    dispatch_async(serialQueue3, ^{
        NSLog(@"3");
    });
    dispatch_async(serialQueue4, ^{
        NSLog(@"4");
    });
    dispatch_async(serialQueue5, ^{
        NSLog(@"5");
    });
    
    //创建目标串行队列
    dispatch_queue_t targetSerialQueue = dispatch_queue_create("com.gcd.setTargetQueue2.targetSerialQueue", NULL);
    
    //设置执行阶层
    dispatch_set_target_queue(serialQueue1, targetSerialQueue);
    dispatch_set_target_queue(serialQueue2, targetSerialQueue);
    dispatch_set_target_queue(serialQueue3, targetSerialQueue);
    dispatch_set_target_queue(serialQueue4, targetSerialQueue);
    dispatch_set_target_queue(serialQueue5, targetSerialQueue);
    
    

    三、利用dispatch source 实现定时器功能

        //1.创建类型为 定时器类型的 Dispatch Source
        //1.1将定时器设置在主线程
        _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
        //1.2设置定时器每一秒执行一次
        dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), 1ull * NSEC_PER_SEC, 0);
        //1.3设置定时器执行的动作
        dispatch_source_set_event_handler(_timer, ^{
            //在这里实现业务逻辑...
            NSLog(@"!!!");
        });
        //2.启动定时器
        dispatch_resume(_timer);
    

    参考:
    多线程-GCD 之dispatch_set_target_queue
    iOS 并发编程 Dispatch_source 最完整总结

    相关文章

      网友评论

          本文标题:iOS 多线程-GCD 之dispatch_set_target

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