AnNSURLSession
将允许您在后台添加大量NSURLSessionTask
下载。
如果你想查看一个单曲的进度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
将远远高于实际平均进度。
所以你必须根据TOTAL countOfBytesReceived
除以TOTAL countOfBytesExpectedToReceive
来计算平均进度。但问题是 a仅在启动时才NSURLSessionTask
计算出这些值,并且可能要等到另一个任务完成后才会启动。
那么如何检查a中所有的平均进度NSURLSessionTasks
NSURLSession
呢?