有關使用afn同時下載多個文件,多個文件下載進度和的計算問題

最近在項目中遇到了多文件下載問題,具體需求是這樣的:

? ? ? ?我們是做的旅游類的項目,一個景區有多個景點,每一個景點有一個音頻文件,現在要求用戶點擊一次能夠下載所有的景點的音頻文件,并且進度只顯示總的進度。第一想法是使用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];

});

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容