这篇文章主要介绍了如何解决iOS中多张图片上传、地址返回顺序的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
解决方案一:
递归调用上传图片的函数、第一张请求成功后,然后第二张,依次进行。当然效率肯定不高,即使上传图片的AFN方法做了多线程处理。中间上传失败了,还继续上传吗?需求决定。所有放弃
解决方案二:
使用GCD 队列组:这里就直接贴代码了:
dispatch_group_t group = dispatch_group_create();
for(..){
dispatch_group_async(group,dispatch_get_global_queue(0, 0), ^{
NSLog(@"队列组:有一个耗时操作完成!");
});
}
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"队列组:前面的耗时操作都完成了,回到主线程进行相关操作");
});
我只能说想法很完美啊,网上也不只提出这种方案,但是我的实践过程是有问题了。网络请求延迟,队列组不可控。所以放弃
方案三:利用数组的有序性:
怎么个利用法?请看:
创建一个模型、两个属性第一个你要上传的数据信息如:image 或者 data ,根据你上传函数需要的参数来定。第二个属性:NSString URL 服务端返回的图片地址:
将你要上传的图片数组、封装成模型数组,数组是有序的这就是重点,for 循环 模型作为参数调用图片上传函数,请求成功后更新模型的值
判断所有的图片上传完毕,然后,就从模型数组里面去取 ,图片 url ,请求自己的服务器api
好了,应该很清楚吧。不清楚再上点干货:
model:
// 建立这个类的目的、主要是为了for循环多张图片上传、成功后回来的地址顺序问题
#import
@interface FMUploadModel : NSObject
//根据自己的上传函数需要决定
@property (nonatomic,strong) NSArray * dataArray;
@property (nonatomic,copy) NSString *imgUrl;
@end
function
//开辟一个多线程 执行图片上传工作
dispatch_queue_t queue = dispatch_queue_create("upimgs", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
// 耗时操作放在这里
__weak typeof(self) weakself = self;
__block int finishNum = 0;
for (int i = 0 ; i < self.selectImgs.count; i++) {
YRFormData *getData = [[YRFormData alloc] init];
getData.data = UIImagePNGRepresentation(self.selectImgs[i]);
getData.name = @"uzee_image";
getData.filename = @"head.png";
getData.mimeType = @"image/png";
NSArray *array = @[getData];
//***********//
FMUploadModel *model = [FMUploadModel new];
model.dataArray = array;
model.imgUrl = @"";
[models addObject:model];
/*******其实是一张一张传的,传数组是调用这个方法**********/
[YRHttpTool postWithURLNoAES:@"*****" params:@{} formDataArray:model.dataArray success:^(id json) {
finishNum ++ ;
model.imgUrl = json[@"response"][@"cloud"];
if (finishNum == self.selectImgs.count) {
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程进行UI操作
[MBProgressHUD hideHUDForView:weakself.view];
updateImage();
});
}
} failure:^(NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程进行UI操作
[MBProgressHUD hideHUDForView:weakself.view];
[MBProgressHUD showError:@"图片上传失败,请稍后再试" toView:self.view];
});
} progress:^(NSProgress *progress) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
float value = 1.0 *progress.completedUnitCount / progress.totalUnitCount;
[MBProgressHUD showDownload:@"发布中..." toView:weakself.view progress:value];
}];
}];
}
});
感谢你能够认真阅读完这篇文章,希望小编分享的“如何解决iOS中多张图片上传、地址返回顺序的问题”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。