俗稱柵欄函數(shù)的
barrier
對于async
和sync
,你了解他的具體含義嗎?sync
會阻塞線程嗎认然,async
的作用又是什么?如果你也存在疑惑漫萄,請繼續(xù)看我為你詳情舉例解答卷员。
1、dispatch_barrier_async , 會將添加到queue前面的任務(wù)執(zhí)行完之后腾务,才會執(zhí)行后面的任務(wù)毕骡,并不會阻塞當(dāng)前的線程
2、dispatch_barrier_sync , 會將添加到queue前面的任務(wù)執(zhí)行完之后岩瘦,才會執(zhí)行后面的任務(wù)未巫,并且會阻塞當(dāng)前的線程
具體請看下述示例代碼:
dispatch_barrier_async
- (void)viewDidLoad {
[super viewDidLoad];
_queue = dispatch_queue_create("com.htmi.Zc", DISPATCH_QUEUE_CONCURRENT);
_dic = [NSMutableDictionary dictionary];
[self barrier];
}
- (void)barrier{
NSLog(@"start");
dispatch_async(_queue, ^{
NSLog(@"1");
});
dispatch_async(_queue, ^{
NSLog(@"2");
});
dispatch_barrier_async(_queue, ^{
NSLog(@"3");
});
NSLog(@"6");
dispatch_async(_queue, ^{
NSLog(@"4");
});
dispatch_async(_queue, ^{
NSLog(@"5");
});
NSLog(@"end");
}
執(zhí)行順序:
start 6 1 2 end 3 4 5
- 比如加上延時函數(shù)再看下效果
- (void)barrier{
NSLog(@"start");
dispatch_async(_queue, ^{
sleep(3);
NSLog(@"1");
});
dispatch_async(_queue, ^{
NSLog(@"2");
});
dispatch_sync(_queue, ^{
sleep(1);
NSLog(@"7");
});
dispatch_barrier_async(_queue, ^{
NSLog(@"3");
});
NSLog(@"6");
dispatch_async(_queue, ^{
NSLog(@"4");
});
dispatch_async(_queue, ^{
NSLog(@"5");
});
NSLog(@"end");
}
執(zhí)行順序:
start 2 6 7 end 1 3 4 5
說明 dispatch_barrier_async , 會將添加到queue前面的任務(wù)執(zhí)行完之后,才會執(zhí)行后面的任務(wù)启昧,并不會阻塞當(dāng)前的線程,45一定在3后
假如改為 dispatch_barrier_async
- (void)barrier{
NSLog(@"start");
dispatch_async(_queue, ^{
sleep(3);
NSLog(@"1");
});
dispatch_async(_queue, ^{
NSLog(@"2");
});
dispatch_sync(_queue, ^{
sleep(1);
NSLog(@"7");
});
dispatch_barrier_sync(_queue, ^{
NSLog(@"3");
});
NSLog(@"6");
dispatch_async(_queue, ^{
NSLog(@"4");
});
dispatch_async(_queue, ^{
NSLog(@"5");
});
NSLog(@"end");
}
執(zhí)行順序:start 2 7 1 3 6 end 4 5
后被添加到柵欄函數(shù)的queue中的任務(wù)叙凡,一需要等待柵欄函數(shù)前面的任務(wù)執(zhí)行完畢之后,才可以執(zhí)行密末,也就是說127一定在3前面狭姨,45一定在3后,而不一樣的是6和end的打印苏遥,當(dāng)換成sync之后會阻塞當(dāng)前線程會等待前面都執(zhí)行完畢之后饼拍,才會打印這兩個,而之前的async田炭,是不會阻塞的师抄,會打印這兩個值,而其余的任務(wù)有順序教硫,而換成sync之后叨吮,在當(dāng)前線程執(zhí)行的任務(wù)也有了順序辆布,這就是dispatch_barrier_sync 和 dispatch_barrier_async 的區(qū)別