//參數1:將barrier添加到的隊列
//參數2:barrier執(zhí)行的block
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
void dispatch_barrier_sync(dispatch_queue_t queue, dispatch_block_t block);
官方文檔關于該函數的文檔說明
說明:
共同點:
1功偿、等待在它前面插入隊列的任務先執(zhí)行完
2、等待他們自己的任務執(zhí)行完再執(zhí)行后面的任務
不同點:
1棋返、dispatch_barrier_sync將自己的任務插入到隊列的時候纯蛾,需要等待自己的任務結束之后才會繼續(xù)插入被寫在它后面的任務幸逆,然后執(zhí)行它們
2巡雨、dispatch_barrier_async將自己的任務插入到隊列之后闰渔,不會等待自己的任務結束,它會繼續(xù)把后面的任務插入到隊列铐望,然后等待自己的任務結束后才執(zhí)行后面任務冈涧。
圖例說明:在添加到隊列的任務1、任務2正蛙、任務3執(zhí)行完畢后督弓,然后才執(zhí)行barrier,barrier執(zhí)行完畢后才執(zhí)行任務4乒验、任務5
代碼如下:dispatch_barrier_async
- (void)concurrentQueueBarrier{
//1 創(chuàng)建并發(fā)隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//2 向隊列中添加任務
dispatch_async(concurrentQueue, ^{
NSLog(@"任務1,%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務2,%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務3,%@",[NSThread currentThread]);
});
dispatch_barrier_async(concurrentQueue, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"我是barrier");
});
NSLog(@"aa");
dispatch_async(concurrentQueue, ^{
NSLog(@"任務4,%@",[NSThread currentThread]);
});
NSLog(@"bb");
dispatch_async(concurrentQueue, ^{
NSLog(@"任務5,%@",[NSThread currentThread]);
});
}
執(zhí)行結果:
任務3,<NSThread: 0x600000078640>{number = 5, name = (null)}
aa
任務1,<NSThread: 0x600000078600>{number = 3, name = (null)}
任務2,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
bb
我是barrier
任務4,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
任務5,<NSThread: 0x600000078600>{number = 3, name = (null)}
代碼如下:dispatch_barrier_sync
- (void)concurrentQueueBarrier{
//1 創(chuàng)建并發(fā)隊列
dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//2 向隊列中添加任務
dispatch_async(concurrentQueue, ^{
NSLog(@"任務1,%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務2,%@",[NSThread currentThread]);
});
dispatch_async(concurrentQueue, ^{
NSLog(@"任務3,%@",[NSThread currentThread]);
});
dispatch_barrier_sync(concurrentQueue, ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"我是barrier");
});
NSLog(@"aa");
dispatch_async(concurrentQueue, ^{
NSLog(@"任務4,%@",[NSThread currentThread]);
});
NSLog(@"bb");
dispatch_async(concurrentQueue, ^{
NSLog(@"任務5,%@",[NSThread currentThread]);
});
}
執(zhí)行結果:
任務3,<NSThread: 0x600000078640>{number = 5, name = (null)}
任務1,<NSThread: 0x600000078600>{number = 3, name = (null)}
任務2,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
我是barrier
aa
bb
任務4,<NSThread: 0x60800007cd00>{number = 4, name = (null)}
任務5,<NSThread: 0x600000078600>{number = 3, name = (null)}
好了愚隧,說到這應該差不多能想通了,我們開始總結
dispatch_barrier_sync和dispatch_barrier_async的共同點:
1锻全、都會等待在它前面插入隊列的任務(1狂塘、2、3)先執(zhí)行完
2虱痕、都會等待他們自己的任務(0)執(zhí)行完再執(zhí)行后面的任務(4睹耐、5辐赞、6)
dispatch_barrier_sync和dispatch_barrier_async的不共同點:
在將任務插入到queue的時候部翘,dispatch_barrier_sync需要等待自己的任務(0)結束之后才會繼續(xù)程序,然后插入被寫在它后面的任務(4响委、5新思、6),然后執(zhí)行后面的任務
而dispatch_barrier_async將自己的任務(0)插入到queue之后赘风,不會等待自己的任務結束夹囚,它會繼續(xù)把后面的任務(4、5邀窃、6)插入到queue
所以荸哟,dispatch_barrier_async的不等待(異步)特性體現在將任務插入隊列的過程假哎,它的等待特性體現在任務真正執(zhí)行的過程
翻譯:
調用這個函數總是在barrier block被提交之后立即返回,不會等到block被執(zhí)行鞍历。當barrier block到并發(fā)隊列的最前端舵抹,他不會立即執(zhí)行。相反劣砍,隊列會等到所有當前正在執(zhí)行的blocks結束執(zhí)行惧蛹。到這時,barrier才開始自己執(zhí)行刑枝。所有在barrier block之后提交的blocks會等到barrier block結束之后才執(zhí)行香嗓。
這里指定的并發(fā)隊列應該是自己通過dispatch_queue_create函數創(chuàng)建的。如果你傳的是一個串行隊列或者全局并發(fā)隊列装畅,這個函數等同于dispatch_async函數靠娱。