美文网首页#iOS#HeminWon多线程
iOS多线程-GCD之dispatch_barrier_asyn

iOS多线程-GCD之dispatch_barrier_asyn

作者: Autolying | 来源:发表于2017-03-05 12:33 被阅读1662次

    上一篇 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

    相关文章

      网友评论

        本文标题:iOS多线程-GCD之dispatch_barrier_asyn

        本文链接:https://www.haomeiwen.com/subject/acdjgttx.html