2010-01-20 1 views
4

У меня есть приложение iPhone, которое использует ASIHTTPRequest для связи с службой REST на моем сервере. Когда я работаю на симуляторе, он работает отлично, но когда я сажусь на телефон, я получаю странное поведение.ASIHTTPRequest синхронно

В первый раз, когда я нажимаю кнопку, которая инициирует запрос, я сразу же возвращаю результаты, и все в порядке. С этого момента, когда я нажимаю кнопку, чтобы начать соединение, для соединения требуется около 2-3 минут. Похоже, что ASIHTTPRequest, который я начал первым (и из которого я уже получил правильные результаты), не завершился. Есть ли какая-то магия, которую мне нужно использовать для завершения первоначального запроса до начала следующего? Я предположил, что, поскольку возвращен метод -start, и у меня есть результаты с сервера, что исходный запрос был завершен, и я мог бы запустить другое.

Любые идеи?

Благодаря

--Steve

ответ

2

Вы не предполагают, чтобы вызвать -start метод, он принадлежит к NSOperation. Интерфейс ASIHTTPRequest является либо -startSynchronous или -startAsynchronous.

Однако настоятельно рекомендуется использовать асинхронный вызов в противном случае, ваш основной поток (то есть, пользовательский интерфейс) будет заблокирован.

Из документации ASIHTTPRequest [1]

В общем, вы должны использовать асинхронные запросы в предпочтение синхронных запросов. Когда вы используете ASIHTTPRequest синхронно с главной темой , пользователь вашего приложения интерфейс закроется и станет непригодным для использования во время запроса . Синхронные запросы только очень подходят для программного обеспечения без UI (как сценарий, который работает от терминала), или если вы работаете в запросе от отдельного потока, который вы поддерживаете (возможно, внутри вашего собственного NSOperation, например).

[1] http://allseeing-i.com/ASIHTTPRequest/How-to-use

+0

Версия ASIHTTPRequest, которую я загрузил в декабре, не имел startSynchronous method, только метод -start. Я загрузил самую последнюю версию ASIHTTPRequest и изменил код для использования startSynchronous, но эффект тот же. – Steve

+0

Переключение на startAsynchronous не помогло. Первый вызов проходит, каждый последующий вызов завершается с ошибкой «Ошибка соединения». Основная ошибка - это таймаут. – Steve

+0

Я изменил код, чтобы каждый ASIHTTPRequest работал в отдельной очереди. Теперь он работает примерно в 50% случаев, а в остальное время он истекает. Это становится расстраивающим. Должен ли я просто отказаться от ASIHTTPRequest для телефона и вернуться в NSURLConnection, чтобы сделать эту работу? – Steve

6

Steve - То, что вы описали это общая проблема, которая может произойти, если запросы пытаются поддерживать постоянное соединение. Попробуйте это:

[request setShouldAttemptPersistentConnection:NO];