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变量记录...
- 在最近工作中,由于种种原因,经常碰到这样一个需求:在显示一个界面之前,需要同时从多个接口获取数据,对全部的数据进行...