NSURLSession
將允許您在其後添加大量的NSURLSessionTask
以供下載。NSURLSession中所有NSURLSessionTasks的平均進度
如果要檢查單個NSURLSessionTask
的進步,它是那麼容易,因爲
double taskProgress = (double)task.countOfBytesReceived/(double)task.countOfBytesExpectedToReceive;
但是,什麼是檢查的所有NSURLSessionTasks
在NSURLSession
平均進展的最佳方式是什麼?
我想我會嘗試平均的所有任務的進度:
[[self backgroundSession] getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *allDownloadTasks) {
double totalProgress = 0.0;
for (NSURLSessionDownloadTask *task in allDownloadTasks) {
double taskProgress = (double)task.countOfBytesReceived/(double)task.countOfBytesExpectedToReceive;
if (task.countOfBytesExpectedToReceive > 0) {
totalProgress = totalProgress + taskProgress;
}
NSLog(@"task %d: %.0f/%.0f - %.2f%%", task.taskIdentifier, (double)task.countOfBytesReceived, (double)task.countOfBytesExpectedToReceive, taskProgress*100);
}
double averageProgress = totalProgress/(double)allDownloadTasks.count;
NSLog(@"total progress: %.2f, average progress: %f", totalProgress, averageProgress);
NSLog(@" ");
}];
但這裏的邏輯是錯的:假設你有50個任務,希望下載1MB和3個任務預計下載100MB。如果50個小任務在3個大任務之前完成,則averageProgress
將遠遠高於實際的平均進度。
所以,你必須根據TOTALcountOfBytesReceived
由TOTALcountOfBytesExpectedToReceive
分計算平均進度。但問題是NSURLSessionTask
只有在啓動時才計算出這些值,並且在另一個任務完成之前它可能不會啓動。
那麼如何檢查所有NSURLSessionTasks
在NSURLSession
的平均進度?
您可以爲每個文件的每個文件發送一個Header請求,爲您的整體進度添加「Content-Length」。 – HAS
這將工作。但就我而言,我可能會碰到一次必須啓動200次下載的情況,因此所有相應的頭文件請求都需要很長時間。儘管如此,這種方法值得詳細闡述,所以如果你把它作爲答案發布,那將是值得的。 – Eric
由於您正在處理200多個項目,爲什麼不讓進度成爲在總數中完成的文件數?我們這樣做是爲了下載超過300個圖像,它絕對矯枉過正,試圖計算確切的字節比例?我的兩分錢:) –