Średni postęp wszystkich zadań NSURLSession w NSURLSession
NaNSURLSession
pozwoli ci dodać do niego dużą liczbęNSURLSessionTask
do pobrania w tle.
Jeśli chcesz sprawdzić postęp pojedynczegoNSURLSessionTask
, to takie proste jak
double taskProgress = (double)task.countOfBytesReceived / (double)task.countOfBytesExpectedToReceive;
Ale jaki jest najlepszy sposób na sprawdzenieśredni postęp wszystkichNSURLSessionTasks
wNSURLSession
?
Myślałem, że spróbuję uśrednić postęp wszystkich zadań:
[[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(@" ");
}];
Ale logika jest tutaj błędna: załóżmy, że masz 50 zadań, które oczekują na pobranie 1 MB i 3 zadania oczekujące na pobranie 100 MB. Jeśli 50 małych zadań zakończy się przed 3 dużymi zadaniami,averageProgress
będzie znacznie wyższy niż rzeczywisty średni postęp.
Musisz więc obliczyć średni postęp wedługCAŁKOWITY countOfBytesReceived
podzielone przezCAŁKOWITY countOfBytesExpectedToReceive
. Ale problem polega na tym, że aNSURLSessionTask
oblicza te wartościdopiero gdy się zaczniei może się nie zacząć, dopóki nie zakończy się inne zadanie.
Jak to sprawdzić?średni postęp wszystkichNSURLSessionTasks
wNSURLSession
?