Ich brauche viele Dateien hochladen (bis zu 100) zum Server AFNetworking in einer einzigen Streaming-Anfrage verwenden, kann ich Fortschritt laden liefern

8

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)

    
Kameshwar Sheoran 28.02.2014, 10:55
quelle

1 Antwort

6

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 applicationDidEnterBackground: für Ihren App-Delegaten aufgerufen wird, können Sie [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:] aufrufen, um nach einer bestimmten Zeit im Hintergrund zu fragen. ( [[UIApplication sharedApplication] endBackgroundTask:]; , 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 NSProgress *overallProgress erstellen und dann [overallProgress becomeCurrentWithPendingUnitCount:<unit size>]; aufrufen, bevor Sie eine neue Anfrage und [overallProgress resignCurrent]; erstellen. Ihr Objekt overallProgress spiegelt den Fortschritt aller untergeordneten Elemente wider.

    
benbarth 05.12.2014 15:27
quelle