dispatch_group_t picDownloadGroup = dispatch_group_create(); // 用于处理图片下载
dispatch_group_t scriptProcessingGroup = dispatch_group_create(); // 用于处理 scripts 属性
for (YJGGoodsModel *goodsModel in goods) {
// 1. 处理 picUrl(图片下载)
if (goodsModel.picUrl) {
dispatch_group_enter(picDownloadGroup); // 标记任务进入图片下载组
[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:goodsModel.picUrl]
completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, BOOL finished) {
if (image) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
CGFloat scale = image.size.height / image.size.width;
CGFloat width = (kScreenWidth() - kNewWidth(24)) / 2.0;
CGFloat picHeight = width * scale;
goodsModel.picHeight = picHeight;
dispatch_group_leave(picDownloadGroup); // 任务完成,离开组
});
} else {
goodsModel.picHeight = YJGW(176); // 默认高度
dispatch_group_leave(picDownloadGroup); // 任务失败也离开组
}
}];
}
// 2. 处理 script 属性
if ([goodsModel.script isKindOfClass:[NSArray class]]) {
if (goodsModel.script.count > 0) {
for (NSDictionary *dic in goodsModel.script) {
if ([dic isKindOfClass:[NSDictionary class]]) {
NSInteger displayType = [[NSString stringWithFormat:@"%@", dic[@"displayType"]] integerValue];
NSString *scriptIconUrl = dic[@"scriptIconUrl"];
if (displayType == 1) {
goodsModel.goodLeftTagImgUrl = scriptIconUrl;
} else if (displayType == 2) {
goodsModel.goodRightTagImgUrl = scriptIconUrl;
} else if (displayType == 3) {
dispatch_group_enter(scriptProcessingGroup); // 标记任务进入 script 组
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
[NSString contextText:goodsModel.mpName imgUrl:scriptIconUrl font:kMFont(14) color:nil completion:^(NSAttributedString *attributedText) {
goodsModel.nameMuStr = attributedText;
dispatch_group_leave(scriptProcessingGroup); // 富文本处理完成,离开组
}];
});
} else {
// 其他 script 处理逻辑
[self asyncMutiAttributeMerge:scriptProcessingGroup withGoodModel:goodsModel];
}
if (displayType == 4) {
goodsModel.priceTagImgUrl = scriptIconUrl;
}
}
}
} else {
// script 数据为空的处理逻辑
[self asyncMutiAttributeMerge:scriptProcessingGroup withGoodModel:goodsModel];
}
} else {
// script 不是数组的处理逻辑
[self asyncMutiAttributeMerge:scriptProcessingGroup withGoodModel:goodsModel];
}
}
// 3. 合并两个任务组的处理结果
dispatch_group_t finalGroup = dispatch_group_create();
dispatch_group_enter(finalGroup); // 合并图片组
dispatch_group_notify(picDownloadGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_leave(finalGroup);
});
dispatch_group_enter(finalGroup); // 合并 script 组
dispatch_group_notify(scriptProcessingGroup, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_group_leave(finalGroup);
});
// 4. 等待两个组完成,计算最终高度
dispatch_group_notify(finalGroup, dispatch_get_main_queue(), ^{
for (YJGGoodsModel *goodModel in goods) {
goodModel.newCellHeight = [self getCellHeight:goodModel];
}
[self.goodsView confire:self.homeModel];
});
iOS oc dispatch_group 多个异步事件处理完时间后,在做统一处理
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- dispatch_queue_t queue = dispatch_get_global_queue(DISPAT...
- dispatch_group中都是同步事件情况例如任务3需要在任务1和任务2执行结束以后(任务1.2是并发执行的)...
- 一. dispatch_group_t 用法 1. dispatch_group_t 执行同步操作 运行,打印...
- (一)、多个网络请求的同步问题 解决1:通过添加标识来判断请求是否全部结束用一个finishedCount变量记录...
- 在最近工作中,由于种种原因,经常碰到这样一个需求:在显示一个界面之前,需要同时从多个接口获取数据,对全部的数据进行...