最近在項(xiàng)目中遇到了多文件下載問題氧敢,具體需求是這樣的:
? ? ? ?我們是做的旅游類的項(xiàng)目,一個(gè)景區(qū)有多個(gè)景點(diǎn)询张,每一個(gè)景點(diǎn)有一個(gè)音頻文件孙乖,現(xiàn)在要求用戶點(diǎn)擊一次能夠下載所有的景點(diǎn)的音頻文件,并且進(jìn)度只顯示總的進(jìn)度。第一想法是使用afn下載功能實(shí)現(xiàn)唯袄,創(chuàng)建多個(gè)下載任務(wù)然后將進(jìn)度做累加得出總的進(jìn)度弯屈。但是在做的過程中發(fā)現(xiàn)并不能這樣做,因?yàn)槊恳粋€(gè)下載的任務(wù)每一次返回的進(jìn)度本身就是一個(gè)累加的過程恋拷,如果在把所有的進(jìn)度累加的話得出的結(jié)果會(huì)遠(yuǎn)遠(yuǎn)大于實(shí)際值资厉。想了各種方法,gcd串型隊(duì)列蔬顾,不行宴偿,operationqueue,也不行诀豁,最后靈光一閃窄刘,既然單個(gè)任務(wù)每次都是一個(gè)累加過程那個(gè)自己回調(diào)進(jìn)度值的話只需要把本次的回調(diào)的值和上次的值做一次減法不就好了嗎,然后馬上嘗試舷胜,果然成了娩践。哈哈哈哈
實(shí)現(xiàn)的代碼如下:
封裝的下載方法:
/**
下載工具
@param fileUrl 下載的文件地址
@param dic 請求參數(shù)
@param result 下載的結(jié)果
*/
+(NSURLSessionDownloadTask *)downLoadTool:(NSString *)fileUrl dataDic:(NSDictionary *)dic progressBlock:(void(^)(CGFloat progressValue))progress resultBlcok:(void(^)(BOOL download))result{
__block CGFloat oldProgress = 0;
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:fileUrl]];
NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
NSLog(@"=======%f",1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount);
CGFloat pro = 1.0 * downloadProgress.completedUnitCount / downloadProgress.totalUnitCount;
progress(pro-oldProgress);
oldProgress = pro;
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
NSString *cachesPath = [CommonTool getMusicPath:@"sight"];
NSString *path = [cachesPath stringByAppendingPathComponent:response.suggestedFilename];
NSLog(@"%@",path);
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
NSLog(@"%@",filePath);
if (error)
{
result(NO);
}else
{
result(YES);
}
}];
[downloadTask resume];
return downloadTask;
}
調(diào)用方法如下:
/**
下載功能
*/
-(void)downloadMehtod{
NSArray *sights = [CommonTool pickegSight:self.downloadScenicModel.sight];
dispatch_queue_t downQueue = dispatch_queue_create("downLoad", DISPATCH_QUEUE_CONCURRENT);
self.scenicTotalSize = sights.count;
for (DSDownloadModel *sight in sights) {
dispatch_async(downQueue, ^{
NSURLSessionDownloadTask *downloadTask = [RequestTool downLoadTool:sight.downfiles dataDic:nil progressBlock:^(CGFloat progressValue) {
_scenicDownloadSize = _scenicDownloadSize + progressValue;
NSLog(@"_+_+_+%f",_scenicDownloadSize);
} resultBlcok:^(BOOL download) {
}];
[self.downloadTaskArr addObject:downloadTask];
});
}
}