5

Ich habe eine Download-Manager-App für iOS 7+ mit NSURLSession implementiert. Der Download-Manager verfügt über eine in die Warteschlange eingereihte Liste von Dateien, die in der Reihenfolge der Priorität heruntergeladen werden. Der Download funktioniert einwandfrei, während sich die App im Hintergrund befindet und Delegiertenanrufe korrekt aufgerufen werden. Aber als App im Hintergrund geht, auch wenn der Download beendet wird es nimmt zu viel Zeit fürHerunterladen einer Liste von 100 Dateien nacheinander mit NSURLSession im Hintergrund

NSURLSession delegate:- **URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL

zu aufgerufen. Manchmal werden die Delegierten überhaupt nicht aufgerufen und wenn ich in den Vordergrund komme, wird der Download-Task-Delegat aufgerufen. Jeder Grund für diese Verzögerung?

+0

Ich bin mit dem gleichen Problem konfrontiert. Ich übergebe ein Array von Elementen und die Delegierungsmethode wird nur ausgelöst, wenn ich die App neu starte. –

+0

Die Callbacks sind inkonsistent und die Downloads nehmen zu viel Zeit in Anspruch. Mit kleinen Dateien habe ich es mit dem Simulator ausprobiert und einige kleine Bilddateien heruntergeladen. Die Callbacks für den fertigen Download brennen, nachdem die Downloads vor 2 oder 3 Minuten abgeschlossen sind Ursachen Verzögerung für den Start der nächsten Datei heruntergeladen werden.Das Problem passiert, sobald ich meine app in den Hintergrund. Im Vordergrund die gleichen Funktionen funktionieren gut. – Sulabh

+0

Befolgen Sie alle Anweisungen in https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW44 (Hintergrundübertragung Überlegungen)? Ich meine, Sie verwenden Hintergrundsitzungskonfiguration und implementieren alle erforderlichen Rückrufe in appDelegate und NSURLSessionDelegate? – user2260054

Antwort

0

Ich hatte ein sehr ähnliches Problem, wo die Hintergrundaufgabe gestartet würde, aber dann scheint zu pausieren. Die Aufgabe wäre dann abgeschlossen, wenn die Anwendung wieder in den Vordergrund rückt.

prüfte ich, dass dies der Fall war, durch die Ausgabe von -(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite Anmeldung

Ich fand, dass die Art und Weise, um dieses Problem zu bekommen, ist zu tun, wie Sie speichern, verarbeiten und Ihren Abschluss-Handler auszuführen.

In meinem Fall beginnt der Prozess mit

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler{ 

[self.fmStore performBackgroundRefresh:^(UIBackgroundFetchResult result) { 

    //Set application badge if new data is available 
    if (result==UIBackgroundFetchResultNewData) [UIApplication sharedApplication].applicationIconBadgeNumber++; 
    completionHandler(result); 

}]; 
} 

, wo eine Remote-Benachrichtigung des Download-Prozess beginnt.

Die Methode, die den Download gibt einen Wert abhängig von der Verfügbarkeit neuer Daten

-(void)performBackgroundRefresh:(void (^)(UIBackgroundFetchResult))completion{ 
    if(newData) completion(UIBackgroundFetchResultNewData); 
    else completion(UIBackgroundFetchResultNoData); 
} 

An dieser Stelle sei auf die ApplicationDelegate kehrt zurück schafft, wo der Abschluss-Handler

- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler{ 
//Store completion handler for background session 
self.sessionCompletionHandler=completionHandler; 
} 

Schließlich gespeichert wird dieser Codeabschnitt ausgeführt, der den Beendigungshandler aufruft und die entsprechenden Benachrichtigungen erstellt

Dieser Prozess hin und her passiert in meinem Fall, da die NSURLSession in einem Objekt existiert, das eine Eigenschaft von ApplicationDelegate ist. Wenn Sie NSURLSession als eine Eigenschaft von ApplicationDelegate selbst implementieren, wird der gesamte Code in derselben Datei vorhanden sein.

Hoffe, dass dies hilft, aber wenn Sie weitere Informationen benötigen, sehen Sie bitte diese beiden Tutorials 1 und 2 als meinen Code basiert auf, was ich in diesen gelesen habe.

+0

@Saddiq Jaffer In der NSURLSession Video in der WWDC 2014 Apple Rat gegen die USA von eins nach dem anderen herunterladen und stattdessen ganze Dateien herunterladen. – Sulabh

+0

Genau das mache ich in der Methode '- (void) performBackgroundRefresh: (void (^) (UIBackgroundFetchResult)) completion'. Der Code zum Herunterladen wird in meinem Beispiel nicht angezeigt, da ich gerade versucht habe, zu demonstrieren, wie man mit Beendigungsroutinen umgeht und sie aufruft. –

Verwandte Themen