ios-Barrier阻塞

来源:互联网 发布:全网分红系统源码 编辑:程序博客网 时间:2024/06/09 15:17

Barrier主要用于在多个异步操作完成之后,统一的对非线程安全的对象进行更新操作

适合于大规模的I/O操作

当访问数据库或文件的时候,更新数据的时候不能喝其他更新或者读取的操作在同一时间执行,我们也可以使用调度组,也可以用dispatch_barrier_async来解决。

我们在使用Barrier只能用并发队列。这里指定的并发队列应该是自己通过dispatch_queue_create函数创建的。如果你传的是一个串行队列或者全局并发队列,这个函数等同于dispatch_async函数。

多线程去操作线程不安全的类会出现问题,就比如说你并行异步的去下载图片的时候,如果同时的去把这些图片添加到可变数组中的时候。这个时候会有线程不安全的问题,就比如说这个时候存在一个问题,如果多个线程去同时去添加图片进数组,只有一个能成功,所以就会出现问题。这个时候我们就可以用dispatch_barrier_async来解决。大概是这样子的。

  //并行队列异步下载图片    for(int i=0;i<100;i++)    {        //创建并行队列        dispatch_queue_t queue =dispatch_queue_create("hh", DISPATCH_QUEUE_CONCURRENT);        dispatch_async(queue, ^{            //模拟下载图片            //等待之前队列中的任务执行完毕之后,再去执行Barrier中的任务            dispatch_barrier_async(queue, ^{                                //添加到可变数组中,                [self.photoArray addObject:image];            });                    });    }


原创粉丝点击