dispatch_barrier_async和dispatch_barrier_sync

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_async和dispatch_barrier_sync_第1张图片

例: 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"); });

打印:
dispatch_barrier_async和dispatch_barrier_sync_第2张图片

注:
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不会阻塞

你可能感兴趣的:(iOS)