刀哥多线程Barrier异步gcd-08-barrier_async
来源:互联网 发布:免费宝贝复制软件 编辑:程序博客网 时间:2024/05/17 01:10
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
必须使用自定义队列,否则执行效果和全局队列一致
0 0
- 刀哥多线程Barrier异步gcd-08-barrier_async
- 多线程——barrier异步
- GCD-Barrier
- 刀哥多线程GCD核心概念gcd
- GCD之barrier
- ios之GCD阻塞Barrier
- iOS GCD dispatch多线程 同步异步
- 多线程:barrier的使用
- C#多线程同步(七)【Barrier】
- 多线程GCD初级讲解,队列与同步异步区别
- 多线程GCD之图片异步加载主队列刷新UI
- 刀哥多线程笔记之gcd-02-block
- 刀哥多线程之gcd-01-sync&async
- 刀哥多线程之03GCD 常用代码
- 刀哥多线程串行队列gcd-04-dispatch_queue_serial
- 刀哥多线程之并发队列gcd-05-dispatch_queue_concurrent
- 刀哥多线程之主队列gcd-06-main_queue
- 刀哥多线程同步任务作用gcd-07-sync_task
- iOS开发核心语言Objective C语言 —— 特有语法及设计模式
- 如何挑选老师
- 【甘道夫】新的阶段
- 基于Android MPAndroidChart实现腾讯QQ群数据统计报表核心功能
- cocos2d-x开发日志04 ——计划任务
- 刀哥多线程Barrier异步gcd-08-barrier_async
- JAVA多线程
- Hdu 1074 Doing Homework 状态压缩DP
- 测试对象销毁后指针是否还可以使用
- 欧拉回路
- JAVA注释
- UINavigationControl
- 小小菜之Cocos2d-x游戏开发旅程——项目实例:贪吃蛇(3)
- 读入优化