需求
我们平时开发有个肯定遇到过上传图片的需求 例如发类似发朋友圈 可以选择 多张图片上传 (一般有 增 删 改 的需求 )
大多数的时候 上传服务器成功都会 给你返回一个 imageID
我们 提交的是时候 就提交 这个 imageID 数组.
问题
例如我们 for 循环上传 image1 image2 image3 image4 image5 (上传是有顺序的 1 2 3... 上传)
每个图片上传成功后都会返回对应的 imageID 我们用一个 数组去接受 imageID
虽然我么上传iamge 是有顺序的,image1最先被上传的 image4最后被上传的.但是我们能保证 image1肯定是第一个上传成功的(imageID1 是最新被回调过来的) image4是最后上传成功的(换句话说返回 图片的 imageID 是有顺序的) 吗? 我们用的是 AF AF是异步的显然不能保证. 虽然 image1 比 image2先上传但是 image2可能比 image1先上传成功.... 这就导致 我们的数组 imageIDArr 和 上传的imageArr 不是对应的
问题分析
我们得到的imageID 数组和 image 数组不对应就没法用了....
我们怎么保证 这个 imageIDArr 和 imageArr 数组一一对应呢? 我们可以在 iamgeArr 都上传成功了我们再对 imageIDArr 进行排序就好了 然后把这个数组返回就好了
这里有两个注意点
(1)让 imageIDArr 的元素 和 imageArr 元素一一对应
(2)是 iamgeArr都上传成功这个时机.
解决问题
+(void)LC_POSTImageArrNetWorkIngWithAPI:(NSString *)api
params:(NSDictionary *)params
fuwuKeyName:(NSString *)fuwuKeyName
imageArr:(NSArray<UIImage *> *)imageArr
success:(void (^)(NSArray<NSDictionary *> * _Nullable))success
failure:(void (^)(NSURLSessionDataTask * _Nullable, NSError * _Nullable))failure showHUD:(BOOL)showHUD{
if ((!api) || (!fuwuKeyName) || (![imageArr isMemberOfClass:[NSArray class]]) || (imageArr.count==0)) {
[SVProgressHUD showErrorWithStatus:@"参数错误"];
}
//重点 我们先创建一个临时数组 数组里面的元素个数和imageArr元素个数一样
NSMutableArray *arr = @[].mutableCopy;
for (int i = 0; i<imageArr.count; i++) {
[arr addObject:@"--"];
}
if (showHUD) {
[SVProgressHUD show];
}
dispatch_group_t group =dispatch_group_create();
for (int i=0; i<imageArr.count; i++) {
UIImage *image = imageArr[i];
if (![image isKindOfClass:[UIImage class]]) {
[SVProgressHUD showErrorWithStatus:@"上传类型错误"];
return;
}
//这里可以留下接口 或者 写规则 上传image数据大小 (因为并不是 有多大图片就向服务器传多大)
NSData *imageData = UIImageJPEGRepresentation(imageArr[i], 0.5);
dispatch_group_enter(group);
[self LC_POSTImageNetWorkIngWithAPI:api params:params fuwuKeyName:fuwuKeyName fileName:@"suibinxie.png" mimeType:@"image/png" shuJu:imageData success:^(NSURLSessionDataTask * _Nullable task, NSDictionary * _Nullable responseObject) {
//这里 block 里面可以根据 i 记录 数组返回的顺序 我们可以根据 i 替换掉上面的临时数组的第 i 个元素....
NSLog(@"i = %d",i);
if (responseObject) {
[arr replaceObjectAtIndex:i withObject:responseObject];
}
dispatch_group_leave(group);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nullable error) {
if (showHUD) {
[SVProgressHUD dismiss];
}
[SVProgressHUD showErrorWithStatus:@"传输错误请重新传入"];
failure(task,error);
return ;
} showHUD:NO];
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
if (showHUD) {
[SVProgressHUD dismiss];
}
//这个就是 图片都上传好的 时机
success(arr.copy);
});
}
dispatch_group_enter(group);
dispatch_group_leave(group);
dispatch_group_notify 保证了异步同步回调 不多说了
网友评论