dispatch_barrier_async和dispatch_barrier_sync

来源:互联网 发布:亿乐社区系统 v2.0源码 编辑:程序博客网 时间:2024/06/05 09:41

dispatch_barrier_async和dispatch_barrier_sync是 GCD 中的两个方法。是不是和dispatch_async及dispatch_sync长得很像,就是多了一个barrier(译:栅栏)。
没错,除了有dispatch_async或dispatch_sync的作用外(是否阻塞当前线程),还有“栅栏”的效果。
意思就是,在该队列,以他们为界,待前面任务执行完成,再把自己内部的任务执行完,才会执行后面的任务。

知道和dispatch_async及dispatch_sync对应,就应该想到:
dispatch_barrier_async不阻塞当前线程,dispatch_barrier_async里面的任务异步执行。
dispatch_barrier_sync会阻塞当前线程,dispatch_barrier_sync里面的任务同步执行。
例: dispatch_barrier_async

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);    //以下任务    dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });    dispatch_barrier_async(concurrentQueue, ^{        sleep(1);        NSLog(@"I am barrier");    });    NSLog(@"当前线程");    dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });

打印:
这里写图片描述

例: dispatch_barrier_sync

dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQ", DISPATCH_QUEUE_CONCURRENT);    //以下任务    dispatch_async(concurrentQueue, ^{ NSLog(@"任务1"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务2"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务3"); });    dispatch_barrier_sync(concurrentQueue, ^{        sleep(1);        NSLog(@"I am barrier");    });    NSLog(@"当前线程");    dispatch_async(concurrentQueue, ^{ NSLog(@"任务4"); });    dispatch_async(concurrentQueue, ^{ NSLog(@"任务5"); });

打印:
这里写图片描述

注:
1.任务1,2,3是无序的。任务4,5是无序的。
2.I am barrier是任务1,2,3与任务4,5的分界线,总是等任务1,2,3执行完,然后I am barrier执行完,才会执行任务4,5。
3.dispatch_barrier_async会阻塞,dispatch_barrier_sync不会阻塞

原创粉丝点击