#iOS#HeminWon多线程

iOS多线程-GCD之dispatch_barrier_asyn

2017-03-05  本文已影响1662人  Autolying

上一篇 iOS多线程-GCD之Dispatch Group

一、释义

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

上一篇下一篇

猜你喜欢

热点阅读