ios - 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个问题:
- 当我同时发出 2 个 100% 丢失网络链接调节器的请求时(第一个超时 20 秒,第二个超时 40 秒),两个请求都在 8 秒后失败。我不明白为什么。
- 当我第一次使用 100% 丢失的网络链接调节器发出一个请求时,它会像预期的那样超时失败,但重试此请求会在 1 秒内失败。我想每次都等待所有超时。
解决方案
很可能,对于 8 秒的故障,DNS 请求超时,因此您根本没有连接。
对于 1 秒的故障,操作系统可能已经断定主机无法访问,并且在网络发生变化或成功向某处的某个主机发出至少一个请求(负 DNS 缓存)之前,甚至不会重试。
也就是说,如果没有数据包跟踪,我无法确定其中任何一个陈述。
推荐阅读
- python - 在具有整数值的类中创建函数
- javascript - 是否允许 JS 引擎更改 NaN 的位?
- ios - 滚动到 CollectionView 底部时,Collection View Cells 会无意中调整大小
- r - %<-% 运算符是做什么的?
- ios - 关闭 TabBarController 后剩余的 TabBar
- python - python 2.7的空闲问题
- c# - 如何解决:“q”的参数验证失败
- linux - 如何测试 File1 的每一行的子字符串是否存在于 File2 中
- google-analytics - 在 Google Analytics 中,是否可以通过用户是否登录来单独跟踪用户?
- javascript - 数组值从 JS 丢失到控制器