美文网首页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