iOS 多线程-GCD栅栏方法

iOS 多线程-GCD任务+队列.
iOS 多线程-GCD队列组.
iOS 多线程-GCD栅栏方法.

上一篇文章记录了队列组的使用,是为了处理多个任务之间的顺序。但是开发中会出现多组任务的顺序问题。
例如:现在有两组任务,每组任务中有多个任务需要并发处理,但是两组任务之间需要顺序执行。这个时候需要用到GCD多线程处理的另一种方式:栅栏方法(dispatch_barrier_async)。

栅栏方法(dispatch_barrier_async)

栅栏方法:就是像筑起一个栅栏一样,将队列中的多组线程任务分割开。

- (void)queueGroupBarrier{
   //创建线程队列
   dispatch_queue_t queue = dispatch_queue_create("barrier", DISPATCH_QUEUE_CONCURRENT);
   
   //创建异步任务并添加到队列
   dispatch_async(queue, ^{
       //任务1
       for (int i = 0; i < 3; i++) {
           [NSThread sleepForTimeInterval:2];
           NSLog(@"任务1的执行=====%d", i);
       }
   });
   
   //创建异步任务并添加到队列
   dispatch_async(queue, ^{
       //任务2
       for (int i = 0; i < 3; i++) {
           [NSThread sleepForTimeInterval:2];
           NSLog(@"任务2的执行=====%d", i);
       }
   });
   
   dispatch_barrier_async(queue, ^{
       //barrier任务
       for (int i = 0; i < 3; i++) {
           [NSThread sleepForTimeInterval:2];
           NSLog(@"barrier的执行=====%d", i);
       }
   });
   
   //创建异步任务并添加到队列
   dispatch_async(queue, ^{
       //任务3
       for (int i = 0; i < 3; i++) {
           [NSThread sleepForTimeInterval:2];
           NSLog(@"任务3的执行=====%d", i);
       }
   });
   
   //创建异步任务并添加到队列
   dispatch_async(queue, ^{
       //任务4
       for (int i = 0; i < 3; i++) {
           [NSThread sleepForTimeInterval:2];
           NSLog(@"任务4的执行=====%d", i);
       }
   });
}

打印结果:
2020-04-09 12:10:41.846262+0800 GCDdemo[10925:2318483] 任务1的执行=====0
2020-04-09 12:10:41.846268+0800 GCDdemo[10925:2318486] 任务2的执行=====0
2020-04-09 12:10:43.851721+0800 GCDdemo[10925:2318483] 任务1的执行=====1
2020-04-09 12:10:43.851754+0800 GCDdemo[10925:2318486] 任务2的执行=====1
2020-04-09 12:10:45.852175+0800 GCDdemo[10925:2318486] 任务2的执行=====2
2020-04-09 12:10:45.852192+0800 GCDdemo[10925:2318483] 任务1的执行=====2
2020-04-09 12:10:47.857707+0800 GCDdemo[10925:2318486] barrier的执行=====0
2020-04-09 12:10:49.863141+0800 GCDdemo[10925:2318486] barrier的执行=====1
2020-04-09 12:10:51.864232+0800 GCDdemo[10925:2318486] barrier的执行=====2
2020-04-09 12:10:53.868686+0800 GCDdemo[10925:2318488] 任务4的执行=====0
2020-04-09 12:10:53.868686+0800 GCDdemo[10925:2318486] 任务3的执行=====0
2020-04-09 12:10:55.873196+0800 GCDdemo[10925:2318488] 任务4的执行=====1
2020-04-09 12:10:55.873196+0800 GCDdemo[10925:2318486] 任务3的执行=====1
2020-04-09 12:10:57.878454+0800 GCDdemo[10925:2318486] 任务3的执行=====2
2020-04-09 12:10:57.878454+0800 GCDdemo[10925:2318488] 任务4的执行=====2

从上面的代码和打印结果可以看出,barrier任务将1、2和3、4两组任务进行了分割。
这里需要注意的是,需求描述为多组项目,但是在开发中,线程队列只有一个,barrier实际上是在一个队列中筑起的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章