一、释义
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);
dispatch_barrier_async一般叫做“栅栏函数”,它就好像栅栏一样可以将多个操作分隔开,在它前面追加的操作先执行,在它后面追加的操作后执行。
栅栏函数也可以执行队列上的操作(参数列表中有queue和block),也有对应的 dispatch_barrier_sync 函数。
二、代码示例
- (void)testBarrierAsync
{
//创建一个并行队列
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");
};
//栅栏函数执行操作
void (^barrierBlk)() = ^{
NSLog(@"Barrier!");
};
//执行所有操作
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);
}
方法执行结果:
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
分析:
栅栏函数之前和之后的操作执行顺序都不固定,但是前面三个必然先执行,然后再执行栅栏函数中的操作,最后执行后面的三个。
三、注意点
dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block)
栅栏函数中传入的参数队列必须是由 dispatch_queue_create 方法创建的队列,否则,与dispatch_async无异,起不到“栅栏”的作用了,对于dispatch_barrier_sync也是同理。
GCD学习代码 如果觉得有用,顺便给颗星哦😄
下一篇:iOS多线程-GCD之dispatch_apply