首页 > 解决方案 > URLRequest 在超时前失败

问题描述

我想为不同的请求设置不同的超时时间。我的请求例程如下所示:

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% 丢失网络链接调节器的请求时(第一个超时 20 秒,第二个超时 40 秒),两个请求都在 8 秒后失败。我不明白为什么。
  2. 当我第一次使用 100% 丢失的网络链接调节器发出一个请求时,它会像预期的那样超时失败,但重试此请求会在 1 秒内失败。我想每次都等待所有超时。

标签: iosnsurlsessionnsurlrequesturlsessionurlrequest

解决方案


很可能,对于 8 秒的故障,DNS 请求超时,因此您根本没有连接。

对于 1 秒的故障,操作系统可能已经断定主机无法访问,并且在网络发生变化或成功向某处的某个主机发出至少一个请求(负 DNS 缓存)之前,甚至不会重试。

也就是说,如果没有数据包跟踪,我无法确定其中任何一个陈述。


推荐阅读