当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS关于多张图片上传、地址返回顺序问题及解决方案

iOS关于多张图片上传、地址返回顺序问题及解决方案

2019年07月23日  | 移动技术网IT编程  | 我要评论

李晋强,卡优卡,江民硬盘锁

先看描述

需求是怎样的: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(@"队列组:前面的耗时操作都完成了,回到主线程进行相关操作");
  });

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

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

怎么个利用法?请看:

创建一个模型、两个属性第一个你要上传的数据信息如: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关于多张图片上传、地址返回顺序问题及解决方案,希望对大家有所帮助

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网