Как установить реальное время ожидания для запроса NSURLConnection?

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

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 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам