iOS多張圖片上傳多執行緒處理方法(可獲取最後一張上傳狀態後的訊號)
阿新 • • 發佈:2019-01-25
環境重現
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];
}];
}
}