Сбой URLRequest до истечения времени ожидания - PullRequest
2 голосов
/ 07 мая 2019

Я хочу установить разные таймауты для разных запросов. Моя процедура запроса выглядит так:

var request = URLRequest(url: url,
                         cachePolicy: .reloadIgnoringLocalCacheData,
                         timeoutInterval: timeout)
// setting headers and body...
sessionTask = localURLSession.dataTask(with: request)
sessionTask?.resume()

где localURLSession определяется как общедоступная переменная:

public var localURLSession: Foundation.URLSession {
    return Foundation.URLSession(configuration: localConfig, delegate: self, delegateQueue: nil)
}

public var localConfig: URLSessionConfiguration {
    let res = URLSessionConfiguration.default
    res.timeoutIntervalForRequest = Self.ordinaryRequestsTimeout // 20 seconds
    return res
}

Тогда у меня 2 проблемы:

  1. Когда я делаю 2 одновременных запроса со 100% потерей Network Link Кондиционер (первый с 20-секундным таймаутом, а второй - с 40 секунд), оба запроса не выполняются через 8 секунд. Я не понимаю почему.
  2. Когда я делаю один запрос в первый раз с потерей 100% Network Link Conditioner, он терпит неудачу во время ожидания, как ожидалось, но повторная попытка этого запроса завершается неудачей в течение 1 секунды. Я хочу подождать все таймаут каждый раз.

1 Ответ

1 голос
/ 08 мая 2019

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

Для 1-секундного сбоя ОС, вероятно, пришла к выводу, что хост недоступен, и даже не попытается снова, пока сеть не изменится или она не выполнит хотя бы один запрос к какому-либо хосту где-либо (отрицательное кэширование DNS).

Тем не менее, без трассировки пакетов, я не могу быть уверен ни в одном из этих утверждений.

...