Eine NSURLSession
können Sie eine große Anzahl von NSURLSessionTask
hinzufügen, um im Hintergrund herunterladen.Durchschnittlicher Fortschritt aller NSURLSessionTasks in einer NSURLSession
Wenn Sie den Fortschritt eines einzelnen NSURLSessionTask
überprüfen wollen, dann ist es so einfach wie
double taskProgress = (double)task.countOfBytesReceived/(double)task.countOfBytesExpectedToReceive;
Aber was ist der beste Weg den durchschnittlichen Fortschritt aller NSURLSessionTasks
in einem NSURLSession
zu überprüfen?
Ich dachte, ich würde versuchen, den Fortschritt aller Aufgaben im Durchschnitt:
[[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(@" ");
}];
Aber die Logik ist hier falsch: Angenommen, Sie 50 Aufgaben erwarten 100MB zum Download erwarten 1MB und 3 Aufgaben zum Download bereit. Wenn die 50 kleinen Aufgaben vor den 3 großen Aufgaben abgeschlossen werden, wird averageProgress
viel höher sein als der tatsächliche durchschnittliche Fortschritt.
So haben Sie durchschnittlich Fortschritte berechnen nach der TOTALcountOfBytesReceived
dividiert durch die TOTALcountOfBytesExpectedToReceive
. Aber das Problem ist, dass ein NSURLSessionTask
diese Werte nur herausfindet, sobald es startet, und es möglicherweise nicht beginnt, bis eine andere Aufgabe beendet wird.
Wie überprüfen Sie den durchschnittlichen Fortschritt aller NSURLSessionTasks
in einem NSURLSession
?
Sie könnten für jede Datei eine Header-Anfrage senden und die "Content-Length" zu Ihrem Gesamtfortschritt hinzufügen. – HAS
Das wird funktionieren. Aber in meinem Fall stoße ich auf Fälle, in denen ich 200 Downloads gleichzeitig starten muss, so dass alle entsprechenden Header-Anfragen lange dauern werden. Es lohnt sich jedoch, diesen Ansatz näher auszuführen, es lohnt sich also, wenn Sie ihn als Antwort veröffentlichen. – Eric
Da Sie mit mehr als 200 Elementen zu tun haben, warum sollte der Fortschritt nicht die Anzahl der abgeschlossenen Dateien über die Gesamtzahl sein? Wir tun dies für das Herunterladen von mehr als 300 Bildern. Es ist definitiv zu viel Aufwand, um den genauen, byteweisen Prozentsatz zu berechnen. Meine zwei Cents :) –