NSURLSessionConfiguration timeoutIntervalForRequest против NSURLSession timeoutInterval
В новом NSURLSession теперь есть значение timeoutIntervalForRequest для объекта NSURLSessionConfiguration, используемого для создания сеанса.
Но в объекте NSURLRequest все еще есть временной интервал, который можно использовать для создания NSURLSessionTask в сеансе.
Мой вопрос в том, что если у конфигурации есть тайм-аутIntervalForRequest, установленный на 30, но использование NSURLRequest для создания задачи имеет тайм-аутInterval 60, какой интервал тайм-аута действительно будет использоваться?
Ответы
Ответ 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 не может запрашивать сотовую сеть.