队列组
- 有这么一种需求
- 首先:分别异步执行2个耗时操作
- 其次:等2个异步操作都执行完毕后,再回到主线程执行操作
- 如果想要高效率的实现这个需求,可以考虑用队列组
- (void)group
{
//创建一个全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 创建一个队列组
dispatch_group_t group = dispatch_group_create();
// 1.任务1
NSArray __block *uArray = nil; //第一个数据请求放到这个数组中
dispatch_group_async(group, queue, ^{
dispatch_group_enter(group); //这个标识很重要
@weakify(self)
//这个是利用rac的网络请求可以替换成自己的网络请求
[[self.otherViewModel.giftListCommand execute:@{@"type": @(0), @"targetUid":SAFE_STR(self.userId)}] subscribeNext:^(id _Nullable x) {
//数组成功之后的处理
@strongify(self)
LPGiftListModel * listModel = x[0];
NSArray *tempArray = [NSArray arrayWithArray:listModel.list];
//截取数组数据的前16个
uArray = [tempArray subarrayWithRange:NSMakeRange(0, 16)];
NSLog(@"11111%@",uArray);
//离开标识
dispatch_group_leave(group);
}];
});
// 2.任务二
NSArray __block *demoArray = nil;
dispatch_group_async(group, queue, ^{
dispatch_group_enter(group);
@weakify(self)
[[self.otherViewModel.giftListCommand execute:@{@"type": @(2), @"targetUid":SAFE_STR(self.userId)}] subscribeNext:^(id _Nullable x) {
LPGiftListModel * listModel = x[0];
NSArray *tempArray = [NSArray arrayWithArray:listModel.list];
demoArray = [tempArray subarrayWithRange:NSMakeRange(0, 8)];
NSLog(@"22222%@",demoArray);
dispatch_group_leave(group);
}];
});
// 3.将数据获取两个数组合并成一个数组
dispatch_group_notify(group, queue, ^{
// 回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
// 4.将新图片显示出来
NSMutableArray *array = [NSMutableArray arrayWithArray:uArray];
[array addObjectsFromArray:demoArray];
self.giftDataArr = array;
NSLog(@"33333%@",array);
});
});
}
-
注意我上方是直接忽略了error 如果有error的处理也要加上离开group的标识。
-
每个任务都要一对enter、leave
-
这个是以前写的数据请求不是用的异步请求,所以不用加标识
- (void)group
{
//创建一个全局的并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 创建一个队列组
dispatch_group_t group = dispatch_group_create();
// 1.下载图片1
dispatch_group_async(group, queue, ^{
// 图片的网络路径
NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
// 加载图片
NSData *data = [NSData dataWithContentsOfURL:url];
// 生成图片
self.image1 = [UIImage imageWithData:data];
});
// 2.下载图片2
dispatch_group_async(group, queue, ^{
// 图片的网络路径
NSURL *url = [NSURL URLWithString:@"http://pic38.nipic.com/20140228/5571398_215900721128_2.jpg"];
// 加载图片
NSData *data = [NSData dataWithContentsOfURL:url];
// 生成图片
self.image2 = [UIImage imageWithData:data];
});
// 3.将图片1、图片2合成一张新的图片
dispatch_group_notify(group, queue, ^{
// 开启新的图形上下文
UIGraphicsBeginImageContext(CGSizeMake(100, 100));
// 绘制图片
[self.image1 drawInRect:CGRectMake(0, 0, 50, 100)];
[self.image2 drawInRect:CGRectMake(50, 0, 50, 100)];
// 取得上下文中的图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
// 结束上下文
UIGraphicsEndImageContext();
// 回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
// 4.将新图片显示出来
self.imageView.image = image;
});
});
}