iOS多图上传涉及到多线程问题,个人比较喜欢使用GCD操作,下边是最近写的一个多图上传代码,附带相关注释

 __block BOOL allSucc = YES;
__block int m = 0;
//创建线程队列上传图片
self.photoDictArray = [NSMutableArray array];
dispatch_queue_t uploadQueue = dispatch_queue_create("upload", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_t group = dispatch_group_create();
dispatch_semaphore_t signal = dispatch_semaphore_create(3);//线程并发数3(保持3张图片同时上传)
for (UIImage * image in self.dataImageArr) {
dispatch_group_enter(group);
dispatch_async(uploadQueue, ^{
dispatch_semaphore_wait(signal, DISPATCH_TIME_FOREVER);
m++;
if (allSucc == NO) {
dispatch_semaphore_signal(signal);
dispatch_group_leave(group);
NSLog(@"本次上传被取消");
}else{
[FileUploader uploadImageToQiniu:image finishAction:^(NSString *url, NSError *error) {
if (!error) {
//上传成功
[self.photoDictArray addObject:@{@"url":url, @"height":@(image.size.height), @"width":@(image.size.width)}];
dispatch_semaphore_signal(signal);
dispatch_group_leave(group);
NSLog(@"第%d次上传成功",m);
}else{
//上传失败
allSucc = NO;
dispatch_semaphore_signal(signal);
dispatch_group_leave(group);
NSLog(@"第%d次上传失败",m);
}
}];
}
});
} dispatch_group_notify(group, dispatch_get_main_queue(), ^{
if (!allSucc) {
//个别图片上传失败
[TipsView showTips:@"图片上传失败,请重试"];
return;
} // NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self.photoDictArray options:NSJSONWritingPrettyPrinted error:nil];
// NSString * imagesStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
//全部上传成功
[HttpClient postUrl:URL_Gossip_Publish dic:@{@"content":self.textView.text, @"images":self.photoDictArray} finish:^(NSURLSessionDataTask *task, id responseObj, NSError *error) {
if (self.submitAction) {
self.submitAction(error);
}
if (!error) {
if (self.isHTMLPush) {
[TipsView showTips:@"发布成功!"];
[self.navigationController popViewControllerAnimated:YES];
}else{
NativeViewController * controller = [[NativeViewController alloc]init];
controller.url = responseObj[@"data"][@"appUrl"];
[[AppDelegate rootNavController] pushViewController:controller animated:YES]; NSMutableArray * controllerArr = [[NSMutableArray alloc]initWithArray:[AppDelegate rootNavController].viewControllers];
if ([controllerArr containsObject:self]) {
[controllerArr removeObject:self];
}
[AppDelegate rootNavController].viewControllers = [[NSArray alloc]initWithArray:controllerArr];
}
}
}];
});

采用信号量和group来控制线程并发,所有图片上传完毕,通过dispatch_group_notify获取到上传结束的动作通知,然后进行下一步操作

iOS多图上传的更多相关文章

  1. iOS - (多图上传已封装)

      /***  上传带图片的内容,允许多张图片上传(URL)POST**  @param url                 网络请求地址*  @param images              ...

  2. iOS 使用AFN 进行单图和多图上传 摄像头/相册获取图片,压缩图片

    图片上传时必要将图片进行压缩,不然会上传失败 首先是同系统相册选择图片和视频.iOS系统自带有UIImagePickerController,可以选择或拍摄图片视频,但是最大的问题是只支持单选,由于项 ...

  3. iOS 使用AFN 进行单图和多图上传

    图片上传时必要将图片进行压缩,不然会上传失败 1.单张图上传 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManag ...

  4. 微信企业号办公系统-JSSDK上传图片(多图上传)

    在开发微信企业号办公系统中,涉及到了图片上传功能,一开始使用的flash插件上传方法,在苹果手机上可以调用相机直接拍摄照片,但在安卓手机上只能选择照片. 微信jssdk-api带有一套完整的调用选择本 ...

  5. HTML5 原生API input file 来实现多图上传,并大图预览

    闲来无事,突然想用原生来实现图片的多图上传. 一.效果图大致如下: 1.上传时可以选择多图 2.上传之后缩略图下过图如下: 3.点击缩略图,大图展示当前所点击的图片,并可以左右滑动查看其它的缩略图对应 ...

  6. yii2组件之多图上传插件FileInput的详细使用

    作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...

  7. 【iOS 使用github上传代码】详解

    [iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...

  8. iOS上架ipa上传问题那些事

    iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...

  9. PHP之:多图上传

    撰写日期:2016-6-30 15:17:35 Thursday 参考 http://a3147972.blog.51cto.com/2366547/1381136 (08-05ThinkPHP+sw ...

随机推荐

  1. Linux基础之常用命令整理(一)

    Linux 操作系统的安装 如今比较流线的linux操作系统 Centos Redhat  Fedora Ubuntu, 安装操作系统的提前是要有操作系统的镜像文件(.iso文件)并且必须为系统指定一 ...

  2. 码云Gitee上新建项目教程

    1.在浏览器访问,https://gitee.com/: 2.使用用户名.密码登录: 3.在左下角显示当前用户的项目,点击“+”号,创建项目: 4.填写项目的相关信息,项目名称要和本地要上传的项目名称 ...

  3. Collection 和 Collections的区别。(转)

    Collection 和 Collections的区别. Collections是个java.util下的类,它包含有各种有关集合操作的静态方法. Collection是个java.util下的接口, ...

  4. Eclipse插件安装springBoot

    首先说的是Eclipse的springBoot开发 首先查看你自己的eclipse的版本,点击help-->about Eclipse查看你自己的eclipse的版本 找到 Eclipse的版本 ...

  5. C#对屏幕分辨率的操作

    winform应用程序 1.新建Resolution.cs类 using System; using System.ComponentModel; using System.Windows.Forms ...

  6. 微信小程序隐藏滚动条

    全局wxss中添加以下样式,可以隐藏所有的滚动条: 包括使用scroll-view组件或者使用overflow-y:scroll;而出现的滚动条: 无论竖向横向滚动条都可隐藏: ::-webkit-s ...

  7. C#生成缩略图,C#给图片添加水印

    生成缩略图 #region 生成缩略图 /// <summary> /// 生成缩略图 /// </summary> /// <param name="orig ...

  8. Android 开发 重写定位器类Timer与TimerTask

    class AttendanceTimer extends Timer { private static final int LOCATION = 0x01; private static final ...

  9. 练习: bs4 简单爬取 + matplotlib 折线图显示 (关键词,职位数量、起薪)

    要看一种技术在本地的流行程度,最简单的就是找招聘网站按关键词搜索. 比如今天查到的职位数量是vue 1296个,react 1204个,angular 721个.国际上比较流行的是react,本地市场 ...

  10. 分布式 基本理论 BASE

    比起CAP的生硬来, 我更加喜欢BASE.BASE 显得更加好理解.尽管BASE 这个名字本身有迎合语言习惯的恶臭味,为什么不是缩写为 BaSsEc 呢? 其实大部分系统是可以 同时 CAP 的, 因 ...