Длинный опрос с NSURLConnection - PullRequest
14 голосов
/ 13 июля 2009

Я работаю над приложением для iPhone, которое будет использовать длинный опрос для отправки уведомлений о событиях с сервера клиенту по HTTP. После открытия соединения на сервере я отправляю небольшие кусочки JSON, которые представляют события по мере их возникновения. Я обнаружил, что -[NSURLConnectionDelegate connection:didReceiveData] не вызывается до тех пор, пока я не закрою соединение, независимо от настроек кэша, которые я использую при создании NSURLRequest. Я проверил, что конец сервера работает должным образом - первое событие JSON будет отправлено немедленно, а последующие события будут отправлены по проводам, как только они происходят. Есть ли способ использовать NSURLConnection для получения этих событий по мере их возникновения, или мне нужно вместо этого перейти к API CFSocket?

Я начинаю работать над интеграцией CocoaAsyncSocket, но предпочел бы по-прежнему использовать NSURLConnection, если это возможно, поскольку он намного лучше соответствует остальной структуре моего веб-сервиса на основе REST / JSON.

Ответы [ 5 ]

7 голосов
/ 13 июля 2009

NSURLConnection буферизует данные во время загрузки и возвращает их вам в один блок с помощью метода didReceiveData. Класс NSURLConnection не может определить разницу между задержкой в ​​сети и преднамеренным разделением данных.

Вам может понадобиться использовать сетевой API более низкого уровня, такой как CFSocket, как вы упомянули (у вас будет доступ к каждому байту, который поступает из сетевого интерфейса, и вы можете различить две части вашей полезной нагрузки), или вы можно было бы взглянуть на библиотеку типа CURL и посмотреть, какие существуют типы буферизации / небуферизации вывода.

3 голосов
/ 10 октября 2009

Я столкнулся с этим сегодня. Я написал свой собственный класс, чтобы справиться с этим, который имитирует базовую функциональность NSURLConnection.

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

0 голосов
/ 07 мая 2010

Существует еще одна реализация HTTP API с именем ASIHttpRequest. У него нет описанной выше проблемы, и он предоставляет полный набор инструментов практически для каждой функции HTTP, включая загрузку файлов, файлы cookie, проверку подлинности, ...

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

0 голосов
/ 22 июля 2009

В настоящее время мы проводим некоторые исследования и разработки для переноса наших кометных библиотек StreamLink на iPhone.

Я обнаружил, что в эмуляторе вы начнете получать обратные вызовы didReceiveData после получения 1 КБ данных. Таким образом, вы можете отправить ненужный блок размером 1 КБ, чтобы начать получать обратные вызовы. Похоже, что на устройстве этого не происходит. В сафари (на устройстве) вам нужно отправить 2 КБ, но с помощью NSURLConnection я тоже не получаю обратных вызовов. Похоже, мне, возможно, придется пойти по тому же пути.

Я мог бы также поиграть с multipart-replace и некоторыми другими более новыми заголовками и типами пантомимы, чтобы увидеть, помогает ли это стимулировать NSURLConnection.

0 голосов
/ 13 июля 2009

Звучит так, как будто вам нужно очистить сокет на стороне сервера, хотя это действительно трудно сказать наверняка. Если вы не можете легко изменить сервер, чтобы сделать это, то это может помочь перехватить сетевое соединение, чтобы увидеть, когда на самом деле отправляется материал с сервера.

Вы можете использовать такой инструмент, как Wireshark, чтобы понюхать вашу сеть.

Еще одна опция для просмотра того, что отправляется / принимается на телефон / с телефона, описана в следующей статье:

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

Удачи!

...