1. 程式人生 > >iOS多張圖片上傳多執行緒處理方法(可獲取最後一張上傳狀態後的訊號)

iOS多張圖片上傳多執行緒處理方法(可獲取最後一張上傳狀態後的訊號)

環境重現

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];
        }];
    }
}