iOS开发-多线程:GCD(五)

本篇继续谈GCD,下一篇再写NSOperationQueue.

1.栅栏(zha lan)函数

//栅栏函数
    dispatch_barrier_async(queue, ^{
       
        NSLog(@"+++++++++++++++++++++++++++++");
    });

作用:在异步并发队列中起到分割的作用。简单的说,就是让多个任务有先后顺序的执行。为什么是异步并发?因为同步函数并不会开线程,任务只会按顺序执行,只有在异步函数 并发队列中才会出现多个任务无序的执行,这时需要制定一定的顺序就可以利用GCD的栅栏函数。
基本使用:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    //0.获得全局并发队列
    //栅栏函数不能使用全局并发队列
    //dispatch_queue_t queue =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
    
    //1.异步函数
    dispatch_async(queue, ^{
       
        NSLog(@"任务一");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务二");
    });
    
    
    //栅栏函数
    dispatch_barrier_async(queue, ^{
       
        NSLog(@"+++++++++++++栅 栏++++++++++++++++");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务三");
    });
    
    dispatch_async(queue, ^{
        NSLog(@"任务四");
    });
}

注意点:栅栏函数不能使用全局并发队列 为什么?因为苹果说的

barry.png

2.队列组
队列组,就是把一个队列或多个队列放在一个组里,当组里的所有队列里的任务执行完以后,队列组可以监听到以便执行后续的任务。
基本使用:

//-1.获得队列组
    dispatch_group_t group = dispatch_group_create();
    
    //0.获得并发队列
    dispatch_queue_t queue =  dispatch_get_global_queue(0, 0);
    
    dispatch_group_async(group, queue,^{
         // 队列中得 第一个任务
    });
    
     dispatch_group_async(group, queue,^{
         
        // 队列中得 第二个任务
    });

    //主线程中执行
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
       
       // 监听到队列组里的任务全部执行完成,然后在主线程中更新UI等操作,当然,这里的队列也可以使用上面的全局队列,根据需要选择
//        });
    });

3.补充,GCD封装任务以函数的形式

512C4DAB-0B4E-4D2C-A01B-402975D95749.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容