Es gibt einige Herausforderungen, denen ich mit der Streaming-Anfrage mit AFNetworking 2.0 gegenüberstehe.
Ich möchte viele Dateien (~ 50MB) auf den Server hochladen und die Anfrage muss STREAMING sein. (Andernfalls stürzt App aufgrund von Speicherdruck ab)
Ich habe verschiedene Möglichkeiten ausprobiert, dies in AFNetworking 2.0 ohne Erfolg zu tun. Das mache ich gerade:
%Vor%Das funktioniert gut, aber es streamt nicht. Es bereitet die Anforderung im Speicher vor, kann abstürzen, wenn die Anfrage zu groß ist. Ich hatte mit nativen Sockets und Streams experimentiert, aber Apple sagt, dass sie die App deswegen ablehnen könnten.
Ein anderer Ansatz, den ich ausprobiert habe, ist folgender:
%Vor%Aber das gibt mir Laufzeitfehler, der sagt:
Beenden der App aufgrund der nicht abgefangenen Ausnahme "NSGenericException" Grund: "Upload-Aufgaben in Hintergrundsitzungen müssen aus einer Datei stammen" *** Erster Aufrufstack: (0 CoreFoundation 0x02cc75e4 __exceptionPreprocess + 180 1 libobjc.A.dylib
0x02a4a8b6 objc_exception_throw + 44 2 CFNetwork
0x0459eb6c - [__ NSCFBackgroundSessionBridge uploadTaskForRequest: uploadFile: bodyData: Vervollständigung:] + 994 3
CFNetwork 0x045f2f37 - [__ NSCFURLSitzung uploadTaskWithStreamedRequest:] + 73
(Muss streaming sein und kann in background fortgesetzt werden)
Ich habe das kürzlich selbst gelöst.
Ich empfehle die Verwendung einer Netzwerkbibliothek wie AFNetworking. Es wird Sie davor bewahren, monotone Aufgaben zu erledigen, die zuvor gelöst wurden.
Um die Anfrage wirklich im Hintergrund zu senden, müssen Sie die gesamte Anfrage in eine Datei schreiben und diese dann mit NSURLSession auf Ihren Server streamen. (Das ist die akzeptierte Antwort - Link unten) Also müssen Sie die Anfrage auf die Festplatte schreiben, ohne ganze Dateien im Speicher zu lesen.
So laden Sie Aufgaben im Hintergrund mit afnetworking
Sie können eine Datei streamen (nicht im Hintergrund) wie:
%Vor%Hinweis: Eine einfache Lösung besteht darin, Zeit für die Ausführung Ihrer App im Hintergrund anzufordern. Wenn %code% für Ihren App-Delegaten aufgerufen wird, können Sie %code% aufrufen, um nach einer bestimmten Zeit im Hintergrund zu fragen. ( %code% , um zu sagen, dass Sie fertig sind.) Was sind die Nachteile, die Sie stellen? Sie haben eine begrenzte Zeit zur Verfügung. „Wenn Sie nicht endBackgroundTask nennen. Für jede Aufgabe, bevor die Zeit abgelaufen ist, das System die App tötet Wenn Sie einen Block Objekt in dem Handler Parameter liefern, ruft das System Handler, bevor die Zeit, um Ihnen eine Chance verfällt die Aufgabe zu beenden. "
Ссылка :
Fortschritt
Sie können den Fortschritt mehrerer NSProgress-Objekte mithilfe der Child / Parent-Beziehung verfolgen. Sie können ein Objekt %code% erstellen und dann %code% aufrufen, bevor Sie eine neue Anfrage und %code% erstellen. Ihr Objekt overallProgress spiegelt den Fortschritt aller untergeordneten Elemente wider.