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 ...
随机推荐
- 常见手机的设备分辨率、viewport和devicePixelRatio
常见手机的设备分辨率和viewport分辨率,及其1rem的大小(以vmin为单位) 常见的devicePixelRatio是1, 1.325, 1.5, 2, 2.4, 3. (具体见下面的表格, ...
- mybatis入门篇:Mybatis注解方式的基本用法
@Select 1.mybatis-config.xml <?xml version="1.0" encoding="UTF-8" ?> <! ...
- spring入门 依赖入注的三种方式(1)
第一种:构造器参数注入 第二种:setter方法属性注入(setter方法的规范-JavaBean规范) 第三种:接口注入 Bean 属性的注入:对一个对象的属性的赋值 1.构造器参数注入: publ ...
- JavaScript数组方法--every、some、fill
接上一篇,JavaScript数组方法--concat.push,继续其他的数组方法. every:every() 方法测试数组的所有元素是否都通过了指定函数的测试. 先看其使用方法: functio ...
- Jupyter 常用快捷键
Command Mode Y : change cell to code M : change cell to markdown R : change cell to raw K : select c ...
- 学习excel的使用技巧复制一列文本成新列去重
学习excel的使用技巧复制一列文本成新列去重 其实比较简单的技巧 知道了就会 不知道就比较麻烦 直接复制到一列 找到 数据选项 删除重复项
- ActiveMQ(3)---ActiveMQ原理分析之消息持久化
持久化消息和非持久化消息的存储原理 正常情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的.能够存储的最大消息数据在${ActiveMQ_HOME}/conf/activemq.xml文 ...
- 对抗生成网络-图像卷积-mnist数据生成(代码) 1.tf.layers.conv2d(卷积操作) 2.tf.layers.conv2d_transpose(反卷积操作) 3.tf.layers.batch_normalize(归一化操作) 4.tf.maximum(用于lrelu) 5.tf.train_variable(训练中所有参数) 6.np.random.uniform(生成正态数据
1. tf.layers.conv2d(input, filter, kernel_size, stride, padding) # 进行卷积操作 参数说明:input输入数据, filter特征图的 ...
- k3生成解决方案时错误处理
F6一键生成,会出现进程使用的错误,关掉了游览器,bos设计器,以及重启了本机iis站点,都没解决,打开任务管理器发现,bos.ide没有关掉
- vue 动态添加 <style> 样式 vue动态添加 绑定自定义字体样式
created(){ //动态添加自定义字体样式 let style = document.createElement('style'); style.type = "text/css&qu ...