iOS多张图片上传

业务需求

1、服务端提供单张上传的接口。
2、客户端需求同时提交多张图片上传。
3、使用AFNetWorking 或 自封装的带有block回调网络状态的框架。

思路分析

1,创建一个管理类。
2,提供一个单例方法。保证管理类唯一
3,提供一个公共方法,传入多张图片必要的参数和文件。
4,在管理类中创建一个全局计数变量,用来统计当前完成的请求(无论成功与失败)。
5,在管理类中创建两个数组(1,存放成功后的回调数据model。2,存放失败后的回调数据model)
6,公共方法中使用for循环,一次性创建多个请求(参数传递看自己情况,保证准确)。
7,在成功回调和失败会掉中都将全局计数变量+1,分别在两个数组中存放数据model,并判断是否和预期的请求数相等,如果是就调用代理方法或者block 将两个数组回传。
8,在接收回调的类中处理两个数组。

实现代码

  • BCatUploadRequestMgr.h
#import <Foundation/Foundation.h>
@class BCatGetLendUploadListsModel;

extern NSString * const  BCatUploadRequestMgr_doUploadResultBlock;

/**
 *  上传队列结束后的统计block
 *
 *  @param successNum    成功的个数
 *  @param failNum       失败的个数
 *  @param successModels 成功的models (imagePath有值)
 *  @param failModels    失败的models  (原model)
 */
typedef void (^ BCatUploadRequestMgrUploadResultBlock) (NSInteger successNum , NSInteger failNum, NSArray * successModels , NSArray * failModels);

@interface  BCatUploadRequestMgr : NSObject

@property (nonatomic , strong)  BCatUploadRequestMgrUploadResultBlock uploadResultBlock;

+ (instancetype)share;

/**
 *  上传附件,model中的imagedata必需有值
 *
 *  @param models NSArray< BCatGetLendUploadListsModel *>
 *  @param uploadResultBlock 执行队列结束后的结果统计
 */
- (void)uploadImagesWithModels:(NSArray *)models uploadResultBlock:( BCatUploadRequestMgrUploadResultBlock)uploadResultBlock;

@end
  • BCatUploadRequestMgr.m
#import "BCatUploadRequestMgr.h"
#import "BCatGetLendUploadListsModel.h"
#import "BCatUpdateLendUploadsInfoRequest.h"
#import "BCatCreditInfoModelMgr.h"

#define BOUNDARY @"AaB03x" //设置边界 参数可以随便设置


NSString * const BCatUploadRequestMgr_doUploadResultBlock = @"BCatUploadRequestMgr_doUploadResultBlock";

@interface BCatUploadRequestMgr()

@property (nonatomic , assign) __block NSInteger successNum; //记录成功上传的附件数
@property (nonatomic , assign) __block NSInteger failNum; //记录上传失败的附件数
@property (nonatomic , strong) __block NSMutableArray * successModels; //存放成功上传的models
@property (nonatomic , strong) __block NSMutableArray * failModels; //存放失败上传的models
@property (nonatomic , assign) NSInteger sumNum; //models 的总数目

@end

@implementation BCatUploadRequestMgr
+ (instancetype)share {
    static BCatUploadRequestMgr * mgr = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        mgr = [[BCatUploadRequestMgr alloc] init];
    });
    return mgr;
}

- (instancetype)init
{
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doUploadResultBlock) name:BCatUploadRequestMgr_doUploadResultBlock object:nil];
    }
    return self;
}

- (void)configParamters {
    self.successNum = 0;
    self.failNum = 0;
    self.sumNum = 0;
    self.successModels = [[NSMutableArray alloc] init];
    self.failModels = [[NSMutableArray alloc] init];
}

//回调
- (void)doUploadResultBlock {
    if (self.uploadResultBlock) {
        self.uploadResultBlock(self.successNum,self.failNum,self.successModels,self.failModels);
    }
}


//检查是否可以回调
- (void)doCheckDoUploadResultBlock {
    if (self.successNum + self.failNum == self.sumNum) {
        [[NSNotificationCenter defaultCenter] postNotificationName:BCatUploadRequestMgr_doUploadResultBlock object:nil];
    }
}

- (void)uploadImagesWithModels:(NSArray *)models uploadResultBlock:(BCatUploadRequestMgrUploadResultBlock)uploadResultBlock {
    self.uploadResultBlock = uploadResultBlock;
    [self configParamters];
    self.sumNum = models.count;
    for (BCatGetLendUploadListsModel *model in models) {


        __block BCatGetLendUploadListsModel * tmpModel = model;


        BCatUpdateLendUploadsInfoRequest * request = [[BCatUpdateLendUploadsInfoRequest alloc] initWithLenRequestId:[model.lendRequestId stringValue]
                                                                                                 attachmentType:model.attachmentType
                                                                                                      imageData:model.imageData
                                                                                                       fileName:[[BCatCreditInfoModelMgr share] getUserIdAddTimeStr]
                                                                                                   attachmentId:model.attachmentId];
        [request startWithCompletionSuccess:^(__kindof BSRequest * _Nullable request) {
            BCatUploadAttachmentModel * attachMentModel = (BCatUploadAttachmentModel *)request.responseModel.data;
            tmpModel.attachmentPath = attachMentModel.attachmentPath;
            tmpModel.type = BCatGetLendUploadListsModelPhotosType;
            tmpModel.lendRequestId = model.lendRequestId;
            tmpModel.attachmentType = model.attachmentType;
            tmpModel.iD = [NSNumber numberWithInteger:[model.attachmentId integerValue]];
            [self.successModels addObject:tmpModel];
            [self.lock lock];
            self.successNum++;
            [self.lock unlock];
            [self doCheckDoUploadResultBlock];
        } failure:^(__kindof BSRequest * _Nullable request) {
            tmpModel.type = BCatGetLendUploadListsModelPhotosType;
            tmpModel.iD = [NSNumber numberWithInteger:[model.attachmentId integerValue]];
            tmpModel.attachmentType = model.attachmentType;
            tmpModel.lendRequestId = model.lendRequestId;

            [self.failModels addObject:tmpModel];
            [self.lock lock];
            self.failNum++;
            [self.lock unlock];
            [self doCheckDoUploadResultBlock];
        }];
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,135评论 1 32
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,251评论 1 23
  • 1.设计模式是什么? 你知道哪些设计模式,并简要叙述?设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型...
    龍飝阅读 2,182评论 0 12
  • 1.属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令伟阅读 1,078评论 0 10
  • 人头攒动的长途客运站,熙攘的人声,川流的摩托佬和的士车,吆喝着卖水果的小贩,客车出发时刺耳的喇叭声,...
    鬼鬼YDan阅读 309评论 1 5