Ś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?

questionAnswers(4)

yourAnswerToTheQuestion