zoukankan      html  css  js  c++  java
  • 栅栏函数dispatch_barrier_sync/async

    有几个并行执行的操作:1,2,3,4,5

    如果我们想要在1,2,3执行完毕后,执行A操作,然后再执行4,5 那么我们就可以使用栅栏函数来解决;

    1、使用dispatch_barrier_sync 串行 函数:
    在插入队列的时候是串行的,在任务真正执行的过程中也是串行的。

    - (void)testCustomBarrier{
        dispatch_queue_t currentQueue = dispatch_queue_create("testCustomBarrierQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 111");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 222");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 333");
        });
    
        dispatch_barrier_sync(currentQueue, ^{
            NSLog(@"============= AAA barrier sync operation");
        });
        NSLog(@"============= After AAA barrier operation");
    
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 444");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 555");
        });
    }

    打印结果:

    2019-07-02 09:38:20.744906+0800 testImportFiles[68888:20594679] ============= 111
    2019-07-02 09:38:20.744913+0800 testImportFiles[68888:20594680] ============= 333
    2019-07-02 09:38:20.744913+0800 testImportFiles[68888:20594681] ============= 222
    2019-07-02 09:38:20.745081+0800 testImportFiles[68888:20594637] ============= AAA barrier sync operation
    2019-07-02 09:38:20.745091+0800 testImportFiles[68888:20594637] ============= After AAA barrier operation
    2019-07-02 09:38:20.745168+0800 testImportFiles[68888:20594680] ============= 444
    2019-07-02 09:38:20.745174+0800 testImportFiles[68888:20594681] ============= 555

    2、使用dispatch_barrier_async 异步 函数:
    在插入队列的时候是异步的,在任务真正执行的过程中是串行的。

    - (void)testCustomBarrier{
        dispatch_queue_t currentQueue = dispatch_queue_create("testCustomBarrierQueue", DISPATCH_QUEUE_CONCURRENT);
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 111");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 222");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 333");
        });
    
        dispatch_barrier_async(currentQueue, ^{
            NSLog(@"============= AAA barrier async operation");
        });
        NSLog(@"============= After AAA barrier operation");
    
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 444");
        });
        dispatch_async(currentQueue, ^{
            NSLog(@"============= 555");
        });
    }

    打印结果和 1 一样:

    2019-07-02 09:38:20.744906+0800 testImportFiles[68888:20594679] ============= 111
    2019-07-02 09:38:20.744913+0800 testImportFiles[68888:20594680] ============= 333
    2019-07-02 09:38:20.744913+0800 testImportFiles[68888:20594681] ============= 222
    2019-07-02 09:38:20.745071+0800 testImportFiles[68888:20594637] ============= After AAA barrier operation
    2019-07-02 09:38:20.745081+0800 testImportFiles[68888:20594637] ============= AAA barrier async operation
    2019-07-02 09:38:20.745168+0800 testImportFiles[68888:20594680] ============= 444
    2019-07-02 09:38:20.745174+0800 testImportFiles[68888:20594681] ============= 555

    实际上dispatch_barrier_sync与dispatch_barrier_async 都会等待在它前面插入队列的任务(这里就是1,2,3)先执行完。且都会等待他们自己的任务(barrier operation)执行完之后再执行后面的任务(4,5)。

    而dispatch_barrier_sync与dispatch_barrier_async的不同点:
    dispatch_barrier_sync需要等待自己的任务(barrier operation)执行完毕后,才会插入后面的任务(4,5),然后执行后面的任务。
    dispatch_barrier_async将自己的任务插入到queue之后,不会等待自己的任务(barrier operation)执行结果,它会继续插入后面的任务。

    转自:https://blog.csdn.net/xuanweihong_ios/article/details/94430867

  • 相关阅读:
    微信小程序wx.request请求用POST后台得不到传递数据
    小程序的movable-view怎么持续移动
    当inline-block或者float失效的时候怎么弄
    js中如何删除json对象的某一个选项
    情非得已
    框架变量的问题
    隐式等待写法__和显示等待对比问题___及误区
    显式等待大结局___封装成API方便控制层调用
    显式等待第二集____灵活写法__
    显式等待__第一集___追加了误区
  • 原文地址:https://www.cnblogs.com/huangzs/p/13518016.html
Copyright © 2011-2022 走看看