业务需求
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];
}];
}
}