An NSURLSession
позволит вам добавить к нему большое количество NSURLSessionTask
для загрузки в фоновом режиме.
Если вы хотите проверить ход одного NSURLSessionTask
, его так же просто, как
double taskProgress = (double)task.countOfBytesReceived / (double)task.countOfBytesExpectedToReceive;
Но каков наилучший способ проверить средний прогресс всех NSURLSessionTasks
в NSURLSession
?
Я думал, что Id пытается усреднить ход всех задач:
[[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 задач, ожидающих загрузки 1 МБ и 3 задач, ожидающих загрузки 100 МБ. Если 50 небольших задач выполняются до 3 больших задач, averageProgress
будет намного выше, чем фактический средний прогресс.
Итак, вы должны рассчитать средний прогресс в соответствии с TOTAL countOfBytesReceived
, деленным на TOTAL countOfBytesExpectedToReceive
. Но проблема в том, что NSURLSessionTask
определяет эти значения только после его запуска, и может не запускаться до завершения другой задачи.
Итак, как вы можете проверить средний прогресс всех NSURLSessionTasks
в NSURLSession
?