Atomare, asynchrone HTTP-Datei POST mit sensibler Rückmeldung?

8

Ich habe gerade mit der Entwicklung von Macs begonnen und festgestellt, dass Cocoa ein nützliches und durchdachtes Framework ist, aber seine HTTP-Funktionalität hat mich verwirrt.

Ich habe ein NSURLConnection-Objekt, um eine Datei von meinem Webserver mit der HTTP GET-Methode herunterzuladen. Die asynchrone Verbindung von NSURLConnect ist großartig, ich bekomme viel Feedback, ich bekomme jeden empfangenen Chunk als neues NSData-Objekt, mit dem ich die Datei auf dem Client-Ende atomar neu erstellen kann und, um dem Benutzer einen Fortschrittsbericht zu geben: [myData length ].

Uploads sind jedoch bei weitem nicht so ordentlich. Sie können entweder eine synchrone Anfrage in einen eigenen Thread stecken oder eine asynchrone Anfrage (von der ich glaube, dass sie einen eigenen Thread erzeugt) aufrufen, aber Sie erhalten keine nützliche Rückmeldung. Es gibt keine Delegierten, die Daten anfordern oder mich wissen lassen, wenn Daten gesendet werden. Vermutlich beschränkt dies mich auf Dateien, die kleiner sind als der verfügbare Speicher.

Meine Frage ist daher, gibt es eine einfache und elegante Lösung für das Hochladen von HTTP-POST-Dateien mit Cocoa, die ein gutes Maß an Feedback und die Möglichkeit bietet, Dateien Teil für Teil und nicht auf einmal zu lesen? Oder sollte ich meine eigene Klasse aus Low-Level-Netzwerkfunktionen schreiben?

Danke!

    
Dani 10.05.2009, 23:02
quelle

5 Antworten

5

Sie können sich das ASIHTTPRequest -Rahmen ansehen. Ich habe es nicht zum Hochladen verwendet, aber es sieht so aus, als hätte es mehr Feedback und die Verwendung ist ziemlich einfach.

    
bbrown 12.05.2009 05:30
quelle
2

Ich entschied mich dafür, mit CFNetwork-Funktionen statt mit NSURLConnection zu arbeiten. Bei asynchronen Benachrichtigungen und bestimmten Funktionen (z. B. bei der Authentifizierung) scheint es etwas flexibler zu sein. Leider ist es ein bisschen komplizierter (zB laufen Schleifen) und ich empfehle Ihnen, den CFNetwork-Referenzleitfaden zu lesen, wenn Sie diesen Weg gehen:

Ссылка

Hier ist ein Codeschnipsel von meiner POST-Routine, FWIW:

%Vor%

    
sehugg 11.05.2009 03:12
quelle
2

ASIHTTPRequest wurde ursprünglich nur für diesen Zweck entwickelt (Tracking des POST-Fortschritts), da dies in der 2.x-API nicht der Fall ist. t möglich mit NSURLConnection. Es wird definitiv einfacher zu integrieren sein als das eigene mit CFNetwork zu rollen, und Sie erhalten viele andere Dinge kostenlos (z. B. Fortschrittsverfolgung über mehrere Anfragen, Fortsetzen von Downloads usw.). :)

Wenn die Dateien, die Sie hochladen, groß sind, achten Sie darauf, die Optionen für das Streaming direkt von der Festplatte zu beachten, damit Sie die Daten nicht im Speicher halten müssen.

    
pokeb 13.05.2009 08:47
quelle
1

Leider hast du recht, dass NSURLConnection hier schwach ist. Der flexibelste Ansatz, den ich empfehlen würde, ist CocoaAsyncSocket . Es bedeutet, dass Sie Ihr eigenes HTTP-Protokoll erstellen, was bedauerlich, aber in den meisten Fällen nicht so schwierig ist. CocoaHTTPServer demonstriert, wie Sie einen vollständigen HTTP-Server oberhalb von CocoaAsyncSocket erstellen und möglicherweise viel nützlichen Code für Ihr Problem haben . Ich habe beide sehr nützlich gefunden.

Ein weiterer Ansatz, der sich zu untersuchen lohnt, ist WebKit. Erstellen Sie ein unsichtbares WebView und loadRequest: ein POST. Ich habe mich nicht damit beschäftigt, ob das geschätzte Change-Benachrichtigungssystem die Zeit zum Hochladen oder nur die Zeit zum Herunterladen enthält, aber es ist einen Versuch wert.

    
Rob Napier 11.05.2009 14:57
quelle
1

Sie können sich den HTTPMessage-Abschnitt von meinem Toolkit-Repository auf github für einen einfachen ObjC-Wrapper ansehen CFHTTPMessageRef; unter anderem wird Ihnen ein NSInputStream-Objekt zur Verfügung gestellt, mit dem Sie über Call-Back-Funktionen für einfache Call-Cards nachdenken können.

Je nachdem, was Sie gerade lesen, sollten Sie sich den Abschnitt StreamingXMLParser des gleichen Repositorys für einen XML- (und HTML-) Parser ansehen, der die Daten in Ihrem Namen direkt von diesem NSInputStream analysiert.

    
Jim Dovey 11.05.2009 16:37
quelle

Tags und Links