参考地址:http://www.cocoachina.com/ios/20180730/24366.html

需求是怎样的:for 循环里面、多个网络请求上传图片,每次上传一张,至于为什么每次只上传一张呢,因为上传一张将要返回图片存储服务器的地址,然后再把地址作为请求参数,请求自己服务器的 API。

过程可以说曲折,不过也有收获

解决方案一:

递归调用上传图片的函数、第一张请求成功后,然后第二张,依次进行。当然效率肯定不高,即使上传图片的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(@"队列组:前面的耗时操作都完成了,回到主线程进行相关操作");
});
 

我只能说想法很完美啊,网上也不只提出这种方案,但是我的实践过程是有问题了。网络请求延迟,队列组不可控。所以放弃

方案三:利用数组的有序性:

怎么个利用法?请看:

  1. 创建一个模型、两个属性第一个你要上传的数据信息如:image 或者 data ,根据你上传函数需要的参数来定。第二个属性:NSString URL 服务端返回的图片地址:

  2. 将你要上传的图片数组、封装成模型数组,数组是有序的这就是重点,for 循环 模型作为参数调用图片上传函数,请求成功后更新模型的值

  3. 判断所有的图片上传完毕,然后,就从模型数组里面去取 ,图片 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连续上传多张图片的更多相关文章

  1. iOS 解决上传100张图片内存奔溃问题

    最近项目需求,从相册中提取100张图片,然后上传到服务器.前提是图片不能压缩.因为要将图片信息采集出来制作出3D模型.所以必须是高清图片. 先看下代码 [NetWorking uploadWithUr ...

  2. iOS -- 上传多张图片 后台(PHP)代码和上传一张的一样

    // 上传多张图片 - (void)send { // 设置初始记录量为0 self.count = 0; self.upcount = 0; // 设置初始值为NO self.isUploadPic ...

  3. 微信JSSDK多图片上传并且解决IOS系统上传一直加载的问题

    微信多图片上传必须挨个上传,也就是不能并行,得串行: 那么我们可以定义一个如下所示的上传函数: var serverIds = []; function uploadImages(localImage ...

  4. POST请求上传多张图片并携带参数

    POST请求上传多张图片并携带参数 在iOS中,用POST请求携带参数上传图片是非常恶心的事情,HTTPBody部分完全需要我们自己来配置,这个HTTPBody分为3个部分,头部分可以携带参数,中间部 ...

  5. 利用exif.js解决ios手机上传竖拍照片旋转90度问题

    html5+canvas进行移动端手机照片上传时,发现ios手机上传竖拍照片会逆时针旋转90度,横拍照片无此问题:Android手机没这个问题. 因此解决这个问题的思路是:获取到照片拍摄的方向角,对非 ...

  6. iOS如何上传代码到Github

    iOS如何上传代码到Github 很多iOS开发者想开源自己的代码或者demo,开源到Github是个不错的选择,那么如何上传我们的代码到Github,令所有人可以下载使用呢?这里我们的目的很明确,就 ...

  7. php用jquery-ajax上传多张图片限制图片大小

    php用jquery-ajax上传多张图片限制图片大小 /** * 上传图片,默认大小限制为3M * @param String $fileInputName * @param number $siz ...

  8. 修正ios h5上传图时的图片方向问题

     .ios上传会在exif中带一个 Orientation的属性,这个属性在windows中不会生效,在ios浏览器中会生效,造成图片在windows资源管理器中与ios浏览器中方向不一致  为了用户 ...

  9. 微信JSSDK上传多张图片

    之前是使用for循环实现的,但是安卓手机没有问题,苹果手机只能上传最后一张图片. 好在有高手在前面趟路,实用的循环调用.苹果是没有,安卓不清楚.以下内容转自:http://leo108.com/pid ...

随机推荐

  1. windows下dump文件调试

    dump调试:在系统中异常或者崩溃的时候,来生成dump文件,然后用调试器来调试.这样就可以在生产环境中的dmp文件,拷贝到自己的开发机器上,调试就可以找到错误的位置,配合程序调试符号pdb文件,直接 ...

  2. python之SQLAlchemy ORM

    前言: 这篇博客主要介绍下SQLAlchemy及基本操作,写完后有空做个堡垒机小项目.有兴趣可看下python之数据库(mysql)操作.下篇博客整理写篇关于Web框架和django基础~~ 一.OR ...

  3. liunx trac 插件使用之GanttCalendarPlugin

    http://trac-hacks.org/wiki/GanttCalendarPlugin官网上的说明很清楚,处理做几点提示,以做记录. 1.我的Trac版本是1.0.1 我使用了'B' Metho ...

  4. 开发常见错误之 : Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar

    SLF4J: Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar on the class path, preempting StackO ...

  5. [Vue warn]: Error in render: "SyntaxError: Unexpected token ' in JSON at position 1"

    一,场景: 字符串转对象: var str = "{'bankRate':5,'YINGUO':0}" 二,操作: JSON.parse(str)时候,报错 [Vue warn]: ...

  6. 调用office COM出现不会退出的问题

    症状 在使用.net调用 Microsoft Office 应用程序时,Office 应用程序在调用Quit方法时不会退出. 原因 Visual Studio.NET 从托管代码调用 COM 对象时, ...

  7. SQL Server2008 R2 安装失败后的解决办法

    当你第一次安装SQL Server2005,SQL Server2008,SQL Server2012失败后,第二次重新安装一般还是容易安装失败,原因就是你没有完全卸载,还存留残留文件和注册表. 我安 ...

  8. 关于kvm虚拟机的克隆方法总结

    kvm虚拟机的克隆分为两种情况,第一种kvm宿主机上对虚拟机直接克隆 第二种通过复制配置文件与磁盘文件的虚拟机复制克隆(适用于异机的静态迁移). 现笔者将分别两种kvm虚拟机克隆的的详细操作过程都记录 ...

  9. python nose测试框架全面介绍九---各种html报告插件对比

    一直在使用Nose-html-reporting,并输出html报告,但今天在使用时发出有点问题:于时,将python目前可能的html报告插件下载后进行对比,如下 一.Nose-html-repor ...

  10. WCF之HTTPS传输WebConfig配置

    <system.serviceModel> <client> <endpoint address="https://evitest.1010bao.com:88 ...