dispatch_barrier_(a)sync

2019-03-20  本文已影响0人  Nulll

在iOS中未来保存某些任务顺序的执行,需要使用dispatch_barrier 来执行。

dispatch_barrier 会让之前的代码先执行完毕;
然后在执行 dispatch_barrier 里面的代码;
之后在执行 dispatch_barrier 后面的代码;

dispatch_barrier_sync 同步执行;
dispatch_barrier_async 异步执行;

直接代码展示。

// 创建一个 queue
    dispatch_queue_t queue = dispatch_queue_create("dispatch_queuq", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
       
        sleep(1);
        NSLog(@"test1");
    });
    NSLog(@"aaaaaa");
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"test2");
    });
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"test3");
    });
    NSLog(@"bbbbbb");
    
    dispatch_barrier_async(queue, ^{
        
        NSLog(@"000000");
        sleep(1);
        NSLog(@"111111");
        sleep(1);
        
        NSLog(@"test0");
    });
    
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"test4");;
    });
    NSLog(@"cccccc");
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"test5");
    });
    dispatch_async(queue, ^{
        sleep(1);
        NSLog(@"test6");
    });
    NSLog(@"dddddd");

结果为如下图片。


屏幕快照 2019-03-20 下午5.24.07.png
///将
    dispatch_barrier_async(queue, ^{
        
        NSLog(@"000000");
        sleep(1);
        NSLog(@"111111");
        sleep(1);
        
        NSLog(@"test0");
    });
/// 其实 dispatch_barrier_async 是异步执行方法。
///修改为
    dispatch_barrier_sync(queue, ^{
        
        NSLog(@"000000");
        sleep(1);
        NSLog(@"111111");
        sleep(1);
        
        NSLog(@"test0");
    });
/// 同步执行。

结果为:


屏幕快照 2019-03-20 下午5.24.55.png
上一篇 下一篇

猜你喜欢

热点阅读