美文网首页
AF上传图片(数组)封装

AF上传图片(数组)封装

作者: 大墙66370 | 来源:发表于2017-12-01 17:44 被阅读33次

需求

我们平时开发有个肯定遇到过上传图片的需求 例如发类似发朋友圈 可以选择 多张图片上传 (一般有 增 删 改 的需求 )
大多数的时候 上传服务器成功都会 给你返回一个 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 保证了异步同步回调 不多说了

具体实现在我的练手 demo NetWorking类中

相关文章

网友评论

      本文标题: AF上传图片(数组)封装

      本文链接:https://www.haomeiwen.com/subject/ntabvxtx.html