Ich arbeite an einer iPhone-Anwendung, die das Hochladen von ganzen Fotos von der Kamera (in der Regel zwischen 1,5 bis 2,0 MB) sowie deren Thumbnails (viel kleiner) in Amazon S3 beinhaltet.
Die Thumbnails werden immer erfolgreich hochgeladen, aber manchmal die vollständigen Bilder nicht, und wenn sie fehlschlagen, schlagen sie mit dem POSIX-Fehlercode 12, auch bekannt als ENOMEM, fehl. Allerdings habe ich Debug-Code hinzugefügt, um die Menge an freiem Speicher zu drucken, wenn der Fehler auftritt, und es ist immer ziemlich frei, in der Regel mehr als 100 MB.
Außerdem tritt der Fehler häufiger auf, wenn der Upload über 3G und weniger über WLAN erfolgt - was merkwürdig erscheint, da die Anfrage nicht viel herunterlädt und die hochgeladene Datei bereits im Speicher ist (I ' Ich habe auch versucht, es von der Festplatte ohne Verbesserung zu streamen).
Ich habe versucht, die Datei mit NSURLConnection, den Foundation CFHTTP * -Funktionen und der ASIHTTPRequest-Bibliothek hochzuladen, aber egal, der Fehler tritt mit derselben Häufigkeit auf. Noch seltsamer ist, dass alles, was mein Googling aufgedeckt hat, ist, dass Endbenutzer manchmal den Fehlercode 12 von Safari erhalten - ich habe keine iOS-Entwickler gesehen, die das erwähnen. Ich arbeite mit einer geerbten Codebasis, daher ist es möglich, dass etwas nicht stimmt, aber ich bin mir nicht einmal sicher, wonach ich suchen soll. Jede Einsicht würde sehr geschätzt werden!
Die einzige Möglichkeit, um dieses Problem zu umgehen, ist die direkte Verwendung von Sockets und die manuelle Erstellung des HTTP-Headers. Mein Upload-Code sieht jetzt so aus:
%Vor%Obwohl ASIHTTPRequest hier funktionieren könnte, haben wir uns entschlossen, von solchen Abhängigkeiten Abstand zu nehmen, um Leistung zu erhalten und alles unter unserer eigenen Kontrolle zu halten. Sie können das Wireshark-Tool verwenden, um diese Art von Problemen zu debuggen.
Um dieses Problem zu umgehen, laden Sie die Datei mit einem Stream hoch. Wenn NSMutableURLRequest verwendet wird, kann dies mit etwas ähnlich dem Folgenden erreicht werden:
%Vor%Wenn ASIHTTPRequest verwendet wird, wird das Streaming einer Datei mit folgendem Ergebnis durchgeführt:
%Vor% Dieser Fehler wurde behoben, indem die Operation für die Anfrage ( NSMutableUrlConnection
) mit @autorelease{}
für die Hauptfunktion verwendet wurde.
NSPOXIS erscheint nur manchmal.