一个 URLSession 中的不同超时

Posted

技术标签:

【中文标题】一个 URLSession 中的不同超时【英文标题】:Different timeouts in one URLSession 【发布时间】:2018-10-04 14:39:39 【问题描述】:

是否可以使用一个URLSession 为每个URLRequest 设置不同的超时间隔?

我试着设置

urlRequest.timeoutInterval = 20 * 60

但它已被 URLSession 忽略,并且请求在默认 60 秒后失败并出现超时错误。

仅此设置更改超时:

let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 20 * 60 // 20 min
self.session = URLSession(configuration: configuration)

20 * 60 // 20 min 应用于该会话中的所有URLRequest

我想让一些任务等待更长的时间等待响应,但其余任务应该默认在默认 60 秒后失败。

有可能吗?或者我应该使用多个URLSession

PS。在研究过程中,我发现了这个错误: https://bugs.swift.org/browse/SR-2680

【问题讨论】:

你确定它是从 ios 端而不是服务器端失败的吗? 是的,当我在 URLSessionConfiguration 上设置 timeoutIntervalForRequest 时,请求等待超过 60 秒 【参考方案1】:

您可以为每个单独的 URL 配置超时。只是不能设置大于 URLSession 配置本身的超时时间。

在某些情况下,此配置中定义的策略可能是 被NSURLRequest 提供的对象指定的策略覆盖 为一个任务。尊重请求对象上指定的任何策略 除非会话的政策更具限制性。例如,如果 会话配置指定蜂窝网络不应该 允许,NSURLRequest 对象无法请求蜂窝网络。

URLSessionConfiguration上的文档

默认超时为 60 秒。您设置为更大的 1200。所以它不起作用。增加您的配置,然后您可以不同地配置每个 url 的超时。

【讨论】:

【参考方案2】:

根据 Apple 的文档,不支持在将 URLSession 分配给 URLSession 后修改其属性。您需要单独创建配置并用它初始化一个单独的实例。

【讨论】:

我正在尝试修改URLRequest 属性。 (urlRequest.timeoutInterval = 20 * 60) 但没有效果

以上是关于一个 URLSession 中的不同超时的主要内容,如果未能解决你的问题,请参考以下文章

URLSession dataTaskPublisher 在特定错误延迟后重试

有没有办法使用 URLSession.shared.dataTask 并行请求多个不同的资源

如何同步 URLSession 任务的串行队列?

xcode ios 模拟器 请求超时

工程日记之ChildLost:URLSession

Swift:UIViewController 实例未从 URLSession 委托方法接收更新