iOS 多线程

GCD中栅栏函数的调用?作用?注意事项?

2017-02-16  本文已影响23人  随心吧

一、需求:

当开发中,需要开启 多个任务,同时需要控制前几个任务和后几个任务的顺序,该怎么办?

二、方法:

可以使用GCD的栅栏函数控制任务的顺序。dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

三、注意事项:

四、代码示例:

1.封装方法asyncBarriCreatGCD

   //栅栏函数
   [self  asyncBarriCreatGCD];

2.方法内容

-(void)asyncBarriCreatGCD
{
    // 0 获取全局并发队列
    // 栅栏函数不嫩更实用全局并发队列
    
    dispatch_queue_t queue = dispatch_queue_create("asycBarri",DISPATCH_QUEUE_CONCURRENT  );
    
    //1 异步函数
    dispatch_async(queue, ^{
        NSLog(@"asyncBarriCreatGCD_1 = %@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"asyncBarriCreatGCD_2 = %@",[NSThread currentThread]);
    });
    //2 栅栏函数
    
    dispatch_barrier_sync(queue, ^{
        NSLog(@"--------------");
    });
    
    
    dispatch_async(queue, ^{
        NSLog(@"asyncBarriCreatGCD_3 = %@",[NSThread currentThread]);
    });

3.打印结果

    /* 结果:任务3在任务2+1的后面,但是1&2的顺序无法控制
     2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46700] asyncBarriCreatGCD_2 = <NSThread: 0x60800026e280>{number = 4, name = (null)}
     2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46703] asyncBarriCreatGCD_1 = <NSThread: 0x608000261c80>{number = 3, name = (null)}
     2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46604] --------------
     2017-02-16 13:07:22.559 01-掌握-GCD-栅栏函数[1005:46703] asyncBarriCreatGCD_3 = <NSThread: 0x608000261c80>{number = 3, name = (null)}

分析:任务1(asyncBarriCreatGCD_1)和2(asyncBarriCreatGCD_2)分别在前面执行,栅栏函数执行-----,最后执行任务3(asyncBarriCreatGCD_3)
     */
}

上一篇下一篇

猜你喜欢

热点阅读