有啥用
在并行隊(duì)列中,為了保持某些任務(wù)的順序,需要等待一些任務(wù)完成后才能繼續(xù)進(jìn)行,使用 barrier 來(lái)等待之前任務(wù)完成,避免數(shù)據(jù)競(jìng)爭(zhēng)等問(wèn)題。
舉個(gè)栗子,老師說(shuō)原地解散,大家上個(gè)廁所,回來(lái)繼續(xù)排隊(duì)去公園,同學(xué)們飛奔向廁所,男孩紙因?yàn)楫吘箍煜±飮W啦很快回來(lái)了,女孩紙因?yàn)槟莻€(gè)原因(你懂得)比較慢還沒(méi)回來(lái),而老師要求是女孩紙排在前面,男孩子排在后面,這時(shí)候就需要一個(gè)"柵欄"保證排隊(duì)的順序不被打亂,男孩紙就等著女生回來(lái)再一起,排隊(duì),去公園,這個(gè)"柵欄"就是dispatch_barrier_async
實(shí)戰(zhàn)
dispatch_queue_t queue = dispatch_queue_create("will's thread", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
dispatch_barrier_async作用是等待1、2兩個(gè)并行操作完成,才繼續(xù)后面3、4并行操作

image.png
如果你去掉dispatch_barrier_async,就全亂咯
- (void)barrier{//同dispatch_queue_create函數(shù)生成的concurrent Dispatch Queue隊(duì)列一起使用
dispatch_queue_t queue = dispatch_queue_create("will's thread", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"----1-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----2-----%@", [NSThread currentThread]);
});
// dispatch_barrier_async(queue, ^{
// NSLog(@"----barrier-----%@", [NSThread currentThread]);
// });
dispatch_async(queue, ^{
NSLog(@"----3-----%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"----4-----%@", [NSThread currentThread]);
});
}

image.png
注意點(diǎn)
使用 dispatch_barrier_async ,該函數(shù)只能搭配自定義并行隊(duì)列 dispatch_queue_t 使用。不能使用: dispatch_get_global_queue ,否則 dispatch_barrier_async 的作用會(huì)和 dispatch_async 的作用一模一樣。