刀哥多线程Barrier异步gcd-08-barrier_async
2015-08-15 21:26
190 查看
Barrier 异步
主要用于在多个异步操作完成之后,统一对非线程安全的对象进行更新
适合于
大规模的 I/O操作
代码演练
准备工作@interface ViewController () { // 加载照片队列 dispatch_queue_t _photoQueue; } @property (nonatomic, strong) NSMutableArray *photoList; @end - (NSMutableArray *)photoList { if (_photoList == nil) { _photoList = [[NSMutableArray alloc] init]; } return _photoList; }
NSMutableArray是非线程安全的
viewDidLoad
- (void)viewDidLoad { [super viewDidLoad]; _photoQueue = dispatch_queue_create("com.itheima.com", DISPATCH_QUEUE_CONCURRENT); for (int i = 0; i < 20; ++i) { [self loadPhotos:i]; } }
模拟下载照片并在完成后添加到数组
- (void)loadPhotos:(int)index { dispatch_async(_photoQueue, ^{ [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]; [self.photoList addObject:image]; NSLog(@"添加照片 %@", fileName); }); }
运行测试
由于
NSMutableArray是非线程安全的,如果出现两个线程在同一时间向数组中添加对象,会出现程序崩溃的情况
解决办法
NSLog(@"添加照片 %@", fileName); dispatch_barrier_async(_photoQueue, ^{ [self.photoList addObject:image]; NSLog(@"OK %@", [NSThread currentThread]); });
使用
dispatch_barrier_async添加的 block 会在之前添加的 block 全部运行结束之后,才在同一个线程顺序执行,从而保证对非线程安全的对象进行正确的操作!
Barrier 工作示意图
注意:
dispatch_barrier_async必须使用自定义队列,否则执行效果和全局队列一致
相关文章推荐
- elnode入门
- DreamWeaverCC2015
- Spring MVC请求映射常见的三种方式
- @property命名时的要点与要注意的问题
- java继承知识总结
- 正方形
- 从上往下打印二叉树(算法)
- MyBatis基础
- C++ Primer 第(4-5)章一句话知识点总结
- 10.1 Qemu的网络管理
- 查看Oracle中是否有锁表的sql
- [Linux 运维 -- 存储] /proc/diskstats详解
- 页面化操作数据库
- stm32 IAP + app的实现
- 博客迁移-爱T-blog
- hdu5387Clock
- 汇编小程序
- junit基础学习之-测试service层(3)
- MongoDB Helper的简单封装
- hdu 1130 How Many Trees?(卡特兰数,大数的乘法与除法)