一、需求:
當開發中,需要開啟 多個
任務,同時需要控制前幾個任務和后幾個任務的順序
,該怎么辦?
二、方法:
可以使用GCD的柵欄函數控制任務的順序。dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
三、注意事項:
- 隊列:
隊列為并發隊列,這個queue
不能是(dispatch_get_global_queue)
全局的并發隊列,所以是用新創建的并發隊列dispatch_queue_create
- 函數:
必須為異步函數async
,同步函數sync
沒有意義。 - 結果:
在前面的任務執行結束后它(柵欄函數)才執行,而且它后面的任務等它執行完成之后才會執行(它前面任務順序不能控制,它后面的順序也不能控制)
四、代碼示例:
1.封裝方法asyncBarriCreatGCD
//柵欄函數
[self asyncBarriCreatGCD];
2.方法內容
-(void)asyncBarriCreatGCD
{
// 0 獲取全局并發隊列
// 柵欄函數不嫩更實用全局并發隊列
dispatch_queue_t queue = dispatch_queue_create("asycBarri",DISPATCH_QUEUE_CONCURRENT );
//1 異步函數
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_1 = %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_2 = %@",[NSThread currentThread]);
});
//2 柵欄函數
dispatch_barrier_sync(queue, ^{
NSLog(@"--------------");
});
dispatch_async(queue, ^{
NSLog(@"asyncBarriCreatGCD_3 = %@",[NSThread currentThread]);
});
3.打印結果
/* 結果:任務3在任務2+1的后面,但是1&2的順序無法控制
2017-02-16 13:07:22.559 01-掌握-GCD-柵欄函數[1005:46700] asyncBarriCreatGCD_2 = <NSThread: 0x60800026e280>{number = 4, name = (null)}
2017-02-16 13:07:22.559 01-掌握-GCD-柵欄函數[1005:46703] asyncBarriCreatGCD_1 = <NSThread: 0x608000261c80>{number = 3, name = (null)}
2017-02-16 13:07:22.559 01-掌握-GCD-柵欄函數[1005:46604] --------------
2017-02-16 13:07:22.559 01-掌握-GCD-柵欄函數[1005:46703] asyncBarriCreatGCD_3 = <NSThread: 0x608000261c80>{number = 3, name = (null)}
分析:任務1(asyncBarriCreatGCD_1)和2(asyncBarriCreatGCD_2)分別在前面執行,柵欄函數執行-----,最后執行任務3(asyncBarriCreatGCD_3)
*/
}