iOS多图上传
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多图上传的更多相关文章
- iOS - (多图上传已封装)
/*** 上传带图片的内容,允许多张图片上传(URL)POST** @param url 网络请求地址* @param images ...
- iOS 使用AFN 进行单图和多图上传 摄像头/相册获取图片,压缩图片
图片上传时必要将图片进行压缩,不然会上传失败 首先是同系统相册选择图片和视频.iOS系统自带有UIImagePickerController,可以选择或拍摄图片视频,但是最大的问题是只支持单选,由于项 ...
- iOS 使用AFN 进行单图和多图上传
图片上传时必要将图片进行压缩,不然会上传失败 1.单张图上传 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManag ...
- 微信企业号办公系统-JSSDK上传图片(多图上传)
在开发微信企业号办公系统中,涉及到了图片上传功能,一开始使用的flash插件上传方法,在苹果手机上可以调用相机直接拍摄照片,但在安卓手机上只能选择照片. 微信jssdk-api带有一套完整的调用选择本 ...
- HTML5 原生API input file 来实现多图上传,并大图预览
闲来无事,突然想用原生来实现图片的多图上传. 一.效果图大致如下: 1.上传时可以选择多图 2.上传之后缩略图下过图如下: 3.点击缩略图,大图展示当前所点击的图片,并可以左右滑动查看其它的缩略图对应 ...
- yii2组件之多图上传插件FileInput的详细使用
作者:白狼 出处:http://www.manks.top/yii2_multiply_images.html 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连 ...
- 【iOS 使用github上传代码】详解
[iOS 使用github上传代码]详解 一.github创建新工程 二.直接添加文件 三.通过https 和 SSH 操作两种方式上传工程 3.1https 和 SSH 的区别: 3.1.1.前者可 ...
- iOS上架ipa上传问题那些事
iOS上架ipa上传问题那些事 原文: http://www.jianshu.com/p/1e22543285c2 字数513 阅读312 评论0 喜欢1 通过xcode直接打包上传,不会提示你的ip ...
- PHP之:多图上传
撰写日期:2016-6-30 15:17:35 Thursday 参考 http://a3147972.blog.51cto.com/2366547/1381136 (08-05ThinkPHP+sw ...
随机推荐
- vs2017使用问题
最近安装了新版本的Visual studio 2017,但是在使用的过程中遇到了这样一个问题.刚启动电脑后,打开vs2017是可以打开的,但是当关掉之后再打开就打不开了,但是任务管理器看可以看到有一 ...
- layer弹出层父子页面交互(子页面form表单提交)
例如:父页面中有数据需要修改,但不需要跳转到下一个页面进行处理 例图:
- 刘志梅2017710101152.《面向对象程序设计(java)》第十三周学习总结
实验十三 图形界面事件处理技术 实验时间 2018-11-22 1.理论知识 (1)任何支持GUI的操作环境都要不断地监视按键或点击鼠标这样的事件. JAVA这样的面向对象语言,都将事件的相关的信息 ...
- 分析RedisRDB和AOF两种持久化机制的工作原理及优劣势
一.RDB和AOF两种持久化机制的介绍 RDB持久化机制,对redis中的数据执行周期性的持久化 AOF机制对每条写入命令作为日志,以append-only(追加)的模式写入一个日志文件中,在redi ...
- django全流程--青空琉璃
@python相关 1.多线程与多进程 https://zhuanlan.zhihu.com/p/45828888 2.用日志logging模块取代print() https://blog.csdn. ...
- appium 使用环境安装配置记录
一.安装配置Java (cmd输入java,回车,没有出现“不是内部或外部命令,也不是可运行的程序或批处理文件”,即为成功) 二.安装node.js (cmd输入node -v,显示版本号即为成功) ...
- 树莓派3使用openSUSE Ports 42.3 驱动GPIO注意事项
安装好opensuse 42.3以后,安装wiringPi库. 由于/proc/cpuinfo文件缺少“Hardware”信息,导致出现如下错误: Oops: Unable to determine ...
- Python第8天
zip() 拉链方法 max(字典) 默认比较字典的key,不同类型的数据不能比较,只要可以被for迭代即可 利用zip与max(字典)共同使用 ord() — chr() ascii码表数字与 ...
- SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端、Eureka 服务信息、Eureka 发现管理、Eureka 安全配置、Eureka-HA(高可用) 机制、Eureka 服务打包部署)
1.概念:Eureka 服务发现框架 2.具体内容 对于服务发现框架可以简单的理解为服务的注册以及使用操作步骤,例如:在 ZooKeeper 组件,这个组件里面已经明确的描述了一个服务的注册以及发现操 ...
- Go 语言 map (映射)
1.Go 语言中 map 的定义及初始化: map[Key_Type]Value_Type scence := make(map[string]int) 2.Go 语言的遍历: scene := ma ...