Как установить реальное время ожидания для запроса NSURLConnection? - PullRequest
1 голос
/ 26 августа 2011

Пожалуйста, посмотрите на следующий код:

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:<...> cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:3.0]; 
<...>
[NSURLConnection sendSynchronousRequest:request returningResponse:&WSresponse error:&WSerror]

Этот код ниже вызывается из фонового потока:

[self performSelectorInBackground:@selector(<...>) withObject:nil];

Иногда sendSynchronousRequest работает намного дольше 3,0 сек.(около 1 минуты).

  1. Как установить реальный тайм-аут вместо того, чтобы не работать timeoutInterval:3.0?
  2. Как добавить возможность пользователю остановить остановку NSURLConnection запрос с помощью кнопки Отменав любой момент?

Большое спасибо за помощь!

Ответы [ 2 ]

3 голосов
/ 26 августа 2011
  1. Обратите внимание, что в дополнение к вызванному вами инициализатору вы также можете вызвать -setTimoutInterval: для NSMutableURLRequest. Значение тайм-аута действительно работает, но любое значение меньше 240 игнорируется - это минимальное значение, соблюдаемое платформой iOS. Если вы хотите установить меньшее значение тайм-аута, то ваш единственный выбор - использовать асинхронный запрос.

  2. Если вы хотите асинхронно отменить запрос (т. Е. Выполнить запрос в фоновом режиме и позволить потоку пользовательского интерфейса переднего плана выдать отмену в ответ на нажатие пользователем кнопки «Отмена» или «Стоп»), то вам необходимо сделать асинхронный URL-запрос. Нет способа сделать это с синхронным запросом. Например, вы даже не можете уничтожить очередь отправки, пока она выполняет блок.

Возможно, вы захотите взглянуть на ASIHTTPRequest, который несколько по-другому описывает эту функцию.

2 голосов
/ 26 августа 2011

Интервал тайм-аута просто описывает количество времени, в течение которого соединение может простаивать в любой момент до истечения времени ожидания. Из документации Apple:

Если во время попытки подключения запрос остается бездействующим дольше, чем время ожидания интервал, время ожидания запроса истекло.

Так что, если ваши данные получают какой-либо значительный объем данных, это займет больше времени.

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

...