Barrier的使用

来源:互联网 发布:新一代域名 编辑:程序博客网 时间:2024/05/19 00:14

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

  • Barrier的工作原理

这里写图片描述

将所有之前添加的异步执行完成之后,在同一个线程中,顺序执行 block 中的代码

接下来我们看一下它是如何实现的 ?

  • 首先创建一个并发队列
_queue = dispatch_queue_create("ejParadise", DISPATCH_QUEUE_CONCURRENT);

注意: 必须是自定义的, 不能使用 _queue = dispatch_get_global_queue(0, 0); 否则执行效果没有影响

  • 准备工作
- (NSMutableArray *)photoList {    if (_photoList == nil) {        _photoList = [NSMutableArray array];    }    return _photoList;}
  • 下载图片
// 开启多个任务,分别下载图片- (void)loadPictures:(int)index {    dispatch_async(_queue, ^{        // 模拟延时        [NSThread sleepForTimeInterval:1.0];        // 模拟从网络下载图片        NSString *fileName = [NSString stringWithFormat:@"%02d.jpg", index % 10 + 1];        NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:nil];        UIImage *image = [UIImage imageWithContentsOfFile:path];        // 将图像添加到数组        // NSMutableArray 不是线程安全的,如果同一个时间点,多个线程项数组添加,有可能会出现崩溃        // 要解决这个问题,需要一个特殊的函数        // 将所有之前添加的异步执行完成之后,在同一个线程中,顺序执行 block 中的代码        dispatch_barrier_async(_queue, ^{            NSLog(@"添加图片 %@ %@", fileName, [NSThread currentThread]);            [self.photoList addObject:image];        });//        [self.photoList addObject:image];        NSLog(@"下载完成 %@ %@", fileName, [NSThread currentThread]);    });}
  • 调用下载
for (int i = 0; i < 10; ++i) {    [self loadPictures:i];}

这样就可以确保图片完成加载后才执行Block里面的内容添加图片

0 0
原创粉丝点击