多线程——barrier异步

  • 主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新,适合于大规模的 I/O 操作
  • 由于 NSMutableArray 是非线程安全的,如果出现两个线程在同一时间向数组中添加对象,会出现程序崩溃的情况
  • 使用 dispatch_barrier_async 添加的 block 会在之前添加的 block 全部运行结束之后,才在同一个线程顺序执行,从而保证对非线程安全的对象进行正确的操作!

模拟加载图片


- (void)loadPic:(NSInteger)index{
    dispatch_async(_queue, ^{
        NSLog(@"下载第%zd张图片,%@",index,[NSThread currentThread]);
        // 加载index指定的图片
        // 获得图片名字
        NSString *imageName = [NSString stringWithFormat:@"%zd.jpg",index];
        // 获得图片的全路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:imageName ofType:nil];
        // 加载图片
        UIImage *image = [UIImage imageWithContentsOfFile:filePath];
// NSLog(@"添加图片到数组中====%@",[NSThread currentThread]);
// [self.images addObject:image];
        dispatch_barrier_async(_queue, ^{
            NSLog(@"添加图片到数组中====%@",[NSThread currentThread]);
            // 将图片添加到数组中
            // NSMutableArray不是线程安全的类,如果同一时间多个线程同时添加元素到数组中,就会出现场问题。
            [self.images addObject:image];
        });
    });
}

你可能感兴趣的:(线程)