一雀费、釋義
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
dispatch_barrier_async一般叫做“柵欄函數(shù)”锦庸,它就好像柵欄一樣可以將多個(gè)操作分隔開敲霍,在它前面追加的操作先執(zhí)行杰标,在它后面追加的操作后執(zhí)行绳慎。
柵欄函數(shù)也可以執(zhí)行隊(duì)列上的操作(參數(shù)列表中有queue和block)纵竖,也有對(duì)應(yīng)的 dispatch_barrier_sync 函數(shù)。
二杏愤、代碼示例
- (void)testBarrierAsync
{
//創(chuàng)建一個(gè)并行隊(duì)列
dispatch_queue_t concurrentQueue = dispatch_queue_create("com.gcd.barrier.concurrentQueue", DISPATCH_QUEUE_CONCURRENT);
//并行操作
void (^blk1)() = ^{
NSLog(@"1");
};
void (^blk2)() = ^{
NSLog(@"2");
};
void (^blk3)() = ^{
NSLog(@"3");
};
void (^blk4)() = ^{
NSLog(@"4");
};
void (^blk5)() = ^{
NSLog(@"5");
};
void (^blk6)() = ^{
NSLog(@"6");
};
//柵欄函數(shù)執(zhí)行操作
void (^barrierBlk)() = ^{
NSLog(@"Barrier!");
};
//執(zhí)行所有操作
dispatch_async(concurrentQueue, blk1);
dispatch_async(concurrentQueue, blk2);
dispatch_async(concurrentQueue, blk3);
dispatch_barrier_async(concurrentQueue, barrierBlk);
dispatch_async(concurrentQueue, blk4);
dispatch_async(concurrentQueue, blk5);
dispatch_async(concurrentQueue, blk6);
}
方法執(zhí)行結(jié)果:
2017-03-13 13:16:00.401 GCDLearn[959:57236] 2
2017-03-13 13:16:00.401 GCDLearn[959:57237] 1
2017-03-13 13:16:00.401 GCDLearn[959:57239] 3
2017-03-13 13:16:00.402 GCDLearn[959:57239] Barrier!
2017-03-13 13:16:00.402 GCDLearn[959:57237] 5
2017-03-13 13:16:00.402 GCDLearn[959:57239] 4
2017-03-13 13:16:00.402 GCDLearn[959:57236] 6
分析:
柵欄函數(shù)之前和之后的操作執(zhí)行順序都不固定靡砌,但是前面三個(gè)必然先執(zhí)行,然后再執(zhí)行柵欄函數(shù)中的操作珊楼,最后執(zhí)行后面的三個(gè)乏奥。
三、注意點(diǎn)
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block)
柵欄函數(shù)中傳入的參數(shù)隊(duì)列必須是由 dispatch_queue_create 方法創(chuàng)建的隊(duì)列亥曹,否則邓了,與dispatch_async無異,起不到“柵欄”的作用了媳瞪,對(duì)于dispatch_barrier_sync也是同理骗炉。
GCD學(xué)習(xí)代碼 如果覺得有用,順便給顆星哦??
下一篇:iOS多線程-GCD之dispatch_apply