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];
        }];
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值