最近在項目中遇到了多文件下載問題,具體需求是這樣的:
? ? ? ?我們是做的旅游類的項目,一個景區有多個景點,每一個景點有一個音頻文件,現在要求用戶點擊一次能夠下載所有的景點的音頻文件,并且進度只顯示總的進度。第一想法是使用afn下載功能實現,創建多個下載任務然后將進度做累加得出總的進度。但是在做的過程中發現并不能這樣做,因為每一個下載的任務每一次返回的進度本身就是一個累加的過程,如果在把所有的進度累加的話得出的結果會遠遠大于實際值。想了各種方法,gcd串型隊列,不行,operationqueue,也不行,最后靈光一閃,既然單個任務每次都是一個累加過程那個自己回調進度值的話只需要把本次的回調的值和上次的值做一次減法不就好了嗎,然后馬上嘗試,果然成了。哈哈哈哈
實現的代碼如下:
封裝的下載方法:
/**
下載工具
@param fileUrl 下載的文件地址
@param dic 請求參數
@param result 下載的結果
*/
+(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;
}
調用方法如下:
/**
下載功能
*/
-(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];
});
}
}