Подтвердить что ты не робот

NSURLSessionConfiguration timeoutIntervalForRequest против NSURLSession timeoutInterval

В новом NSURLSession теперь есть значение timeoutIntervalForRequest для объекта NSURLSessionConfiguration, используемого для создания сеанса.

Но в объекте NSURLRequest все еще есть временной интервал, который можно использовать для создания NSURLSessionTask в сеансе.

Мой вопрос в том, что если у конфигурации есть тайм-аутIntervalForRequest, установленный на 30, но использование NSURLRequest для создания задачи имеет тайм-аутInterval 60, какой интервал тайм-аута действительно будет использоваться?

4b9b3361

Ответ 1

Поскольку мое исследование по iOS 7.0.3, timeoutInterval для NSURLRequest не дает никаких эффектов, когда оно используется с NSURLSession.

Установлен ли timeoutIntervalForRequest для NSURLSessionConfiguration или нет, timeoutInterval просто игнорируется.

Вы можете использовать мое маленькое примерное приложение NetworkTimeoutSample для проверки этого поведения.

Когда вы установите 1 для поля "URLReq", которое влияет на timeoutInterval для NSURLRequest, затем нажмите кнопку "NSURLSession With URLRequest", ваш сеанс не получит ошибку тайм-аута.

Вы также можете распознать, что вместо timeoutIntervalForRequest для NSURLSession следует установить timeoutIntervalForResource, если вы хотите получить тот же эффект тайм-аута для timeoutInterval NSURLRequest.

Если вы установите значения timeoutIntervalForRequest и timeoutIntervalForResource для NSURLSessionConfiguration, это повлияет на меньшее значение (я считаю, что это поведение отличается от текущего документа API).

Нет документации по этим спецификациям, поэтому она может быть изменена в будущей версии iOS.

Ответ 2

Так как iOS8, NSUrlSession в фоновом режиме не вызывает этот метод делегата, если сервер не отвечает. -(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error Загрузка/загрузка остается бездействующей. Этот делегат вызывается на iOS7 с ошибкой, когда сервер не отвечает.

В общем случае фоновый сеанс NSURLSession не прерывает задачу, если что-то пойдет не так на провод. Скорее, он продолжает искать подходящее время для запуска запроса и повторных попыток в это время. Это продолжается до истечения времени ожидания ресурса (то есть значения свойства timeoutIntervalForResource в объекте NSURLSessionConfiguration, который вы используете для создания сеанса). Текущее значение по умолчанию для этого значения - одна неделя! Другими словами, поведение ошибки в тайм-ауте в iOS7 было неверным. В контексте фонового сеанса более интересным является немедленное прерывание из-за сетевых проблем. Так как iOS8, задача NSURLSession продолжается, даже если она сталкивается с таймаутами и потерей сети. Он продолжает, однако, до тех пор, пока не будет достигнут интервал времениIntervalForResource.

Итак, в основном timeoutIntervalForRequest не будет работать в фоновом сеансе, но timeoutIntervalForResource будет.

Я получил этот ответ от одного из членов Apple Staff на форуме разработчиков . Кроме того, я проверил это, выполнив.

Ответ 3

Похоже, что все изменилось с тех пор, как n-miyo проверил его.

В документации Apple указано, что значение NSURLRequest переопределит конфигурацию сеанса.

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