美文网首页iOS 多线程
GCD中dispatch_set_target_queue使用全

GCD中dispatch_set_target_queue使用全

作者: 山水域 | 来源:发表于2017-05-04 13:52 被阅读324次

    用法一:指定优先级

    系统的Global Queue是可以指定优先级的,那我们可以用到dispatch_set_target_queue这个方法来指定自己创建队列的优先级
    在这里我们解释一下:dispatch_queue_create函数生成的DisPatch Queue不管是Serial DisPatch Queue还是Concurrent Dispatch Queue,执行的优先级都与默认优先级的Global Dispatch queue相同,如果需要变更生成的Dispatch Queue的执行优先级则需要使用dispatch_set_target_queue函数

    代码用法一:

    dispatch_queue_t serialDiapatchQueue=dispatch_queue_create("com.GCD_demo.www", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t dispatchgetglobalqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
        
        // 第一个参数为要设置优先级的queue,第二个参数是参照物,既将第一个queue的优先级和第二个queue的优先级设置一样。
        dispatch_set_target_queue(serialDiapatchQueue, dispatchgetglobalqueue);
        
        
        dispatch_async(serialDiapatchQueue, ^{
            NSLog(@"我优先级低,先让让");
        });
        
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSLog(@"我优先级高,我先block");
        });
    
    打印结果:
    2017-05-04 11:08:49.388 Practice_Animation[1408:539481] 我优先级高,我先block
    2017-05-04 11:08:49.388 Practice_Animation[1408:539185] 我优先级低,先让让
    

    用法二:队列执行

    2、dispatch_set_target_queue除了能用来设置队列的优先级之外,还能够创建队列的层次体系,当我们想让不同队列中的任务同步的执行时,我们可以创建一个串行队列,然后将这些队列的target指向新创建的队列即可
    解读使用dispatch_set_target_queue将多个串行的queue指定到了同一目标,那么着多个串行queue在目标queue上就是同步执行的,不再是并行执行。

        //1.创建目标队列
        dispatch_queue_t targetQueue = dispatch_queue_create("test.target.queue", DISPATCH_QUEUE_SERIAL);
        
        //2.创建3个串行队列
        dispatch_queue_t queue1 = dispatch_queue_create("test.1", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue2 = dispatch_queue_create("test.2", DISPATCH_QUEUE_SERIAL);
        dispatch_queue_t queue3 = dispatch_queue_create("test.3", DISPATCH_QUEUE_SERIAL);
        
        //3.将3个串行队列分别添加到目标队列
        dispatch_set_target_queue(queue1, targetQueue);
        dispatch_set_target_queue(queue2, targetQueue);
        dispatch_set_target_queue(queue3, targetQueue);
        
        
        dispatch_async(queue1, ^{
            NSLog(@"1 in");
            [NSThread sleepForTimeInterval:3.f];
            NSLog(@"1 out");
        });
        
        dispatch_async(queue2, ^{
            NSLog(@"2 in");
            [NSThread sleepForTimeInterval:2.f];
            NSLog(@"2 out");
        });
        dispatch_async(queue3, ^{
            NSLog(@"3 in");
            [NSThread sleepForTimeInterval:1.f];
            NSLog(@"3 out");
        });
    
    打印结果:
    2017-05-04 11:37:05.638 Practice_Animation[1456:648304] 1 in
    2017-05-04 11:37:08.643 Practice_Animation[1456:648304] 1 out
    2017-05-04 11:37:08.644 Practice_Animation[1456:648304] 2 in
    2017-05-04 11:37:10.649 Practice_Animation[1456:648304] 2 out
    2017-05-04 11:37:10.649 Practice_Animation[1456:648304] 3 in
    2017-05-04 11:37:11.652 Practice_Animation[1456:648304] 3 out
    

    线程注意事项

    生成多个Serial DisPatch Queue时的注意事项

    Serial DisPatch Queue是一个串行队列,只能同时执行1个追加处理(即任务),当用Dispatch_queue_create函数生成多个Serial DisPatch Queue时,每个Serial DisPatch Queue均获得一个线程,即多个Serial DisPatch Queue可并发执行,同时处理添加到各个Serial DisPatch Queue中的任务,但要注意如果过多地使用多线程,就会消耗大量内存,引起大量的上下文切换,大幅度降低系统的响应性能,所以我们只在为了避免多个线程更新相同资源导致数据竞争时,使用Serial DisPatch Queue。

    相关文章

      网友评论

        本文标题:GCD中dispatch_set_target_queue使用全

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