14 Stimmen

Lange Abfrage mit NSURLConnection

Ich arbeite an einer iPhone-Anwendung, die Long-Polling verwenden wird, um Ereignisbenachrichtigungen vom Server an den Client über HTTP zu senden. Nachdem ich eine Verbindung auf dem Server geöffnet habe, sende ich kleine JSON-Bits, die Ereignisse darstellen, sobald sie auftreten. Ich stelle fest, dass -[NSURLConnectionDelegate connection:didReceiveData] wird erst aufgerufen, nachdem ich die Verbindung geschlossen habe, unabhängig von den Cache-Einstellungen, die ich beim Erstellen der NSURLRequest . Ich habe überprüft, dass das Serverende wie erwartet funktioniert - das erste JSON-Ereignis wird sofort gesendet, und nachfolgende Ereignisse werden über die Leitung gesendet, wenn sie auftreten. Gibt es eine Möglichkeit zu verwenden NSURLConnection um diese Ereignisse zu empfangen, wenn sie auftreten, oder muss ich stattdessen auf die CFSocket-API zurückgreifen?

Ich fange an, an der Integration von CocoaAsyncSocket zu arbeiten, würde es aber vorziehen, weiterhin mit NSURLConnection wenn möglich, da es viel besser zum Rest meiner REST/JSON-basierten Webdienststruktur passt.

0 Stimmen

Hey, ich habe gesehen, dass Sie asyncsocket verwendet, um das gewünschte Ergebnis zu erhalten. Jede Chance, ich könnte Ihr Gehirn über diese irgendwann holen? Ich bin @suprfrends auf Twitter. Es würde sehr geschätzt werden!

0 Stimmen

Ich konnte dies herausfinden .... check out: stackoverflow.com/questions/1293026/

0 Stimmen

Ich habe eine Lösung für dieses Problem gefunden, siehe meine Antwort hier: stackoverflow.com/questions/1293026/

7voto

Matt Bridges Punkte 46113

NSURLConnection puffert die Daten während des Herunterladens und gibt sie in einem Stück an Sie zurück. didReceiveData Methode. Die Website NSURLConnection Die Klasse kann nicht zwischen einer Netzwerkverzögerung und einer absichtlichen Aufteilung der Daten unterscheiden.

Sie müssten entweder eine niedrigere Netzwerk-API wie CFSocket verwenden, wie Sie erwähnen (Sie hätten Zugriff auf jedes Byte, wie es von der Netzwerkschnittstelle kommt, und könnten die beiden Teile Ihrer Nutzlast unterscheiden), oder Sie könnten einen Blick auf eine Bibliothek werfen wie CURL und sehen Sie nach, welche Arten der Ausgabepufferung/nicht-Pufferung es dort gibt.

3voto

nall Punkte 15613

Das habe ich heute erlebt. Ich schrieb meine eigene Klasse, um dies zu behandeln, die die grundlegende Funktionalität von NSURLConnection imitiert.

http://github.com/nall/SZUtilities/blob/master/SZURLConnection.h

0voto

Allen Hadden Punkte 11

Es hört sich so an, als ob Sie den Socket auf der Serverseite flushen müssen, obwohl es wirklich schwierig ist, das mit Sicherheit zu sagen. Wenn Sie den Server nicht so einfach ändern können, kann es helfen, die Netzwerkverbindung abzuhören, um zu sehen, wann die Daten tatsächlich vom Server gesendet werden.

Sie können ein Tool wie Wireshark verwenden, um Ihr Netzwerk zu durchsuchen.

Eine andere Möglichkeit, um zu sehen, was vom/zum Telefon gesendet/empfangen wird, wird im folgenden Artikel beschrieben:

http://blog.jerodsanto.net/2009/06/sniff-your-iphones-network-traffic/

Viel Glück!

0voto

Wir arbeiten derzeit daran, unsere StreamLink-Comet-Bibliotheken auf das iPhone zu portieren.

Ich habe festgestellt, dass man im Emulator didReceiveData-Callbacks erhält, sobald 1KB an Daten empfangen wurde. Man kann also einen 1 KB großen Junk-Block senden, um Rückrufe zu erhalten. Auf dem Gerät scheint dies jedoch nicht zu passieren. In Safari (auf dem Gerät) müssen Sie 2KB senden, aber mit NSURLConnection bin ich auch keine Rückrufe erhalten. Sieht so aus, als müsste ich den gleichen Ansatz nehmen.

Ich könnte auch mit multipart-replace und einigen anderen neuartigen Headern und Mime-Typen spielen, um zu sehen, ob es hilft, NSURLConnection zu stimulieren.

0voto

Ali Nadalizadeh Punkte 2568

Es gibt eine weitere HTTP-API-Implementierung namens ASIHttpRequest. Sie hat das oben genannte Problem nicht und bietet ein komplettes Toolkit für fast jede HTTP-Funktion, einschließlich Datei-Uploads, Cookies, Authentifizierung, ...

http://allseeing-i.com/ASIHTTPRequest/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X