有關(guān)使用afn同時(shí)下載多個(gè)文件,多個(gè)文件下載進(jìn)度和的計(jì)算問(wèn)題

最近在項(xiàng)目中遇到了多文件下載問(wèn)題,具體需求是這樣的:

? ? ? ?我們是做的旅游類(lèi)的項(xiàng)目,一個(gè)景區(qū)有多個(gè)景點(diǎn),每一個(gè)景點(diǎn)有一個(gè)音頻文件,現(xiàn)在要求用戶(hù)點(diǎn)擊一次能夠下載所有的景點(diǎn)的音頻文件,并且進(jìn)度只顯示總的進(jìn)度。第一想法是使用afn下載功能實(shí)現(xiàn),創(chuàng)建多個(gè)下載任務(wù)然后將進(jìn)度做累加得出總的進(jìn)度。但是在做的過(guò)程中發(fā)現(xiàn)并不能這樣做,因?yàn)槊恳粋€(gè)下載的任務(wù)每一次返回的進(jìn)度本身就是一個(gè)累加的過(guò)程,如果在把所有的進(jìn)度累加的話得出的結(jié)果會(huì)遠(yuǎn)遠(yuǎn)大于實(shí)際值。想了各種方法,gcd串型隊(duì)列,不行,operationqueue,也不行,最后靈光一閃,既然單個(gè)任務(wù)每次都是一個(gè)累加過(guò)程那個(gè)自己回調(diào)進(jìn)度值的話只需要把本次的回調(diào)的值和上次的值做一次減法不就好了嗎,然后馬上嘗試,果然成了。哈哈哈哈

實(shí)現(xiàn)的代碼如下:

封裝的下載方法:

/**

下載工具

@param fileUrl 下載的文件地址

@param dic 請(qǐng)求參數(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];

});

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容