环境重现
1,服务端提供单张上传的接口。
2,客户端需求同时提交多张图片上传。
3,使用AFNetWorking 或 自封装的带有block回调网络状态的框架。
思路
1,创建一个管理类。
2,提供一个单例方法。保证管理类唯一
3,提供一个公共方法,传入多张图片必要的参数和文件。
4,在管理类中创建一个全局计数变量,用来统计当前完成的请求(无论成功与失败)。
5,在管理类中创建两个数组(1,存放成功后的回调数据model。2,存放失败后的回调数据model)
6,公共方法中使用for循环,一次性创建多个请求(参数传递看自己情况,保证准确)。
7,在成功回调和失败会掉中都将全局计数变量+1,分别在两个数组中存放数据model,并判断是否和预期的请求数相等,如果是就调用代理方法或者block 将两个数组回传。
8,在接收回调的类中处理两个数组。
代码Demo
代码是从工程中考出来的,看主要逻辑,细节业务不用关心
CUUploadRequestMgr.h
#import <Foundation/Foundation.h>
@class CUGetLendUploadListsModel;
extern NSString * const CUUploadRequestMgr_doUploadResultBlock;
/**
* 上传队列结束后的统计block
*
* @param successNum 成功的个数
* @param failNum 失败的个数
* @param successModels 成功的models (imagePath有值)
* @param failModels 失败的models (原model)
*/
typedef void (^CUUploadRequestMgrUploadResultBlock) (NSInteger successNum , NSInteger failNum, NSArray * successModels , NSArray * failModels);
@interface CUUploadRequestMgr : NSObject
@property (nonatomic , strong) CUUploadRequestMgrUploadResultBlock uploadResultBlock;
+ (instancetype)share;
/**
* 上传附件,model中的imagedata必需有值
*
* @param models NSArray<CUGetLendUploadListsModel *>
* @param uploadResultBlock 执行队列结束后的结果统计
*/
- (void)uploadImagesWithModels:(NSArray *)models uploadResultBlock:(CUUploadRequestMgrUploadResultBlock)uploadResultBlock;
@end
CUUploadRequestMgr.m
#import "CUUploadRequestMgr.h"
#import "CUGetLendUploadListsModel.h"
#import "CUUpdateLendUploadsInfoRequest.h"
#import "CUCreditInfoModelMgr.h"
#define BOUNDARY @"AaB03x" //设置边界 参数可以随便设置
NSString * const CUUploadRequestMgr_doUploadResultBlock = @"CUUploadRequestMgr_doUploadResultBlock";
@interface CUUploadRequestMgr()
@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 CUUploadRequestMgr
+ (instancetype)share {
static CUUploadRequestMgr * mgr = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mgr = [[CUUploadRequestMgr alloc] init];
});
return mgr;
}
- (instancetype)init
{
self = [super init];
if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doUploadResultBlock) name:CUUploadRequestMgr_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:CUUploadRequestMgr_doUploadResultBlock object:nil];
}
}
- (void)uploadImagesWithModels:(NSArray *)models uploadResultBlock:(CUUploadRequestMgrUploadResultBlock)uploadResultBlock {
self.uploadResultBlock = uploadResultBlock;
[self configParamters];
self.sumNum = models.count;
for (CUGetLendUploadListsModel *model in models) {
__block CUGetLendUploadListsModel * tmpModel = model;
CUUpdateLendUploadsInfoRequest * request = [[CUUpdateLendUploadsInfoRequest alloc] initWithLenRequestId:[model.lendRequestId stringValue]
attachmentType:model.attachmentType
imageData:model.imageData
fileName:[[CUCreditInfoModelMgr share] getUserIdAddTimeStr]
attachmentId:model.attachmentId];
[request startWithCompletionSuccess:^(__kindof BSRequest * _Nullable request) {
CUUploadAttachmentModel * attachMentModel = (CUUploadAttachmentModel *)request.responseModel.data;
tmpModel.attachmentPath = attachMentModel.attachmentPath;
tmpModel.type = CUGetLendUploadListsModelPhotosType;
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 = CUGetLendUploadListsModelPhotosType;
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];
}];
}
}