iOS oc dispatch_group 多个异步事件处理完时间后,在做统一处理

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];
});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容