2009-07-13 23 views
14

Sto lavorando a un'applicazione iPhone che utilizzerà il polling lungo per inviare notifiche di eventi dal server al client tramite HTTP. Dopo aver aperto una connessione sul server, invierò piccoli bit di JSON che rappresentano gli eventi, mentre si verificano. Sto trovando che -[NSURLConnectionDelegate connection:didReceiveData] non viene chiamato fino a quando non chiudo la connessione, indipendentemente dalle impostazioni della cache che utilizzo durante la creazione di NSURLRequest. Ho verificato che il server funzioni come previsto: il primo evento JSON verrà inviato immediatamente e gli eventi successivi verranno inviati via cavo mentre si verificano. C'è un modo per utilizzare NSURLConnection per ricevere questi eventi nel momento in cui si verificano, o devo invece scendere all'API CFSocket?Polling lungo con NSURLConnection

Sto iniziando a lavorare sull'integrazione di CocoaAsyncSocket, ma preferirei continuare a utilizzare NSURLConnection se possibile poiché si adatta molto meglio al resto della mia struttura di servizi Web basata su REST/JSON.

+0

Ehi, ho visto che hai usato asyncsocket per ottenere il risultato desiderato. Qualche possibilità di cogliere il tuo cervello a proposito di questo? Sono @suprfrends su Twitter. Sarebbe molto apprezzato! –

+0

sono stato in grado di capire questo fuori .... check out: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

+0

Ho trovato un soluzione per esso, vedere la mia risposta qui: http://stackoverflow.com/questions/1293026/http-connection-with-nsurlconnection-in-iphone/14828690#14828690 – wakkus

risposta

7

NSURLConnection bufferizzerà i dati durante il download e restituirà tutto in un blocco con il metodo didReceiveData. La classe NSURLConnection non è in grado di distinguere tra ritardo di rete e divisione intenzionale nei dati.

È necessario utilizzare un'API di rete di livello inferiore come CFSocket come si menziona (si avrebbe accesso a ciascun byte non appena entrerà nell'interfaccia di rete e si potrebbero distinguere le due parti del proprio carico utile), oppure potresti dare un'occhiata a una libreria come CURL e vedere quali tipi di buffer di output/non-buffering ci sono.

+1

Questo è ciò di cui avevo paura. Penso che andrò con CocoaAsyncSocket piuttosto che trattare direttamente con CFSocket. – pix0r

+0

Per la cronaca, CocoaAsyncSocket ha funzionato alla grande, anche se ci sono voluti un paio d'ore in più per far funzionare tutto correttamente. – pix0r

+0

Felice che alla fine ha funzionato! –

0

Sembra che sia necessario svuotare lo zoccolo sul lato server, anche se è davvero difficile dirlo con certezza. Se non è possibile modificare facilmente il server per farlo, allora può essere utile sniffare la connessione di rete per vedere quando roba viene effettivamente inviata dal server.

È possibile utilizzare uno strumento come Wireshark per sniffare la rete.

Un'altra opzione per vedere cosa sta facendo inviato/ricevuto al/dal telefono è descritta nel seguente articolo:

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

Buona fortuna!

+0

Posso collegarmi via telnet a Verificare che i dati stiano scendendo in modo incrementale, come previsto. Sembra che NSURLConnection memorizzi sempre i dati come menzionato da Matt. – pix0r

0

Attualmente stiamo facendo un po 'di R & D per portare le nostre librerie di comete StreamLink su iPhone.

Ho trovato che nell'emulatore si inizierà a ricevere i callbackReceiveData dopo aver ricevuto 1 KB di dati. In questo modo puoi inviare un blocco spazzatura da 1 KB per iniziare a ricevere i callback. Sembra che sul dispositivo, tuttavia, questo non accada. In Safari (sul dispositivo) è necessario inviare 2 KB, ma utilizzando NSURLConnection anche io non ricevo richiami. Sembra che potrei dover seguire lo stesso approccio.

Potrei anche giocare con multipart-replace e alcune altre più innovative intestazioni e tipi di mime per vedere se aiuta a stimolare NSURLConnection.

+0

Raccomanderei davvero di usare CocoaAsyncSocket invece - è abbastanza semplice implementare i comandi HTTP di base da soli se ne hai bisogno. Chissà come Apple potrebbe cambiare NSURLConnection in futuro ... – pix0r

0

C'è un'altra implementazione HTTP API denominata ASIHttpRequest. Non ha il problema indicato sopra e fornisce un toolkit completo per quasi tutte le funzionalità HTTP, inclusi Upload di file, Cookie, Autenticazione, ...

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

+0

E a differenza di rotolare tu stesso ASIHttpRequest sembra gestire proxy HTTP, autenticazione, ecc., Tutto ciò che perdi se decidi "hey, è solo una connessione socket più l'invio di alcuni intestazioni, quanto può essere difficile? " :) Uno dei motivi principali per utilizzare COMET su TCP o UDP è che passa attraverso firewall aziendali fascisti. –

Problemi correlati