美文网首页iOS 多线程
GCD中栅栏函数的调用?作用?注意事项?

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

作者: 随心吧 | 来源:发表于2017-02-16 13:31 被阅读23次

    一、需求:

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

    二、方法:

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

    三、注意事项:

    • 队列:
      队列为并发队列,这个queue不能是(dispatch_get_global_queue)全局的并发队列,所以是用新创建的并发队列dispatch_queue_create
    • 函数:
      必须为异步函数async,同步函数sync没有意义。
    • 结果:
      在前面的任务执行结束后它(栅栏函数)才执行,而且它后面的任务等它执行完成之后才会执行(它前面任务顺序不能控制,它后面的顺序也不能控制)

    四、代码示例:

    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)
         */
    }
    
    

    相关文章

      网友评论

        本文标题:GCD中栅栏函数的调用?作用?注意事项?

        本文链接:https://www.haomeiwen.com/subject/althwttx.html