关闭

多线程——barrier异步

标签: 线程
626人阅读 评论(0) 收藏 举报
分类:
  • 主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新,适合于大规模的 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];
        });
    });
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:301061次
    • 积分:4620
    • 等级:
    • 排名:第6569名
    • 原创:169篇
    • 转载:1篇
    • 译文:0篇
    • 评论:45条
    博客专栏
    文章分类
    最新评论