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實際上是在一個隊列中築起的。

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