【问题标题】:URLSession dataTask timeout errorURLSession dataTask 超时错误
【发布时间】:2016-10-21 13:27:38
【问题描述】:

我目前在尝试将数据发布到我的网络服务器时遇到了一些有关 URLSession 的问题。然而,这完美地工作。似乎不起作用的是我设置的超时。这对我的整个应用程序来说非常重要,因为我不希望用户永远“加载”,而没有任何类型的错误消息。这是我的代码:

var request = URLRequest(url: URL(string: "https://www.mywebsite.com/file.php")!, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, timeoutInterval: 20)

let urlconfig = URLSessionConfiguration.default
urlconfig.timeoutIntervalForRequest = 20
urlconfig.timeoutIntervalForResource = 20

request.httpMethod = "POST"
let session = URLSession(configuration: urlconfig, delegate: self, delegateQueue: nil)//URLSession.shared
let body = "receiver=\(receiverID)"
request.httpBody = body.data(using: String.Encoding.utf8, allowLossyConversion: true)
request.timeoutInterval = 20

session.dataTask(with: request) {data, response, err in
    if err == nil {
        do {
            let jsonResult:NSDictionary? =  try JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as? NSDictionary
            let jsonComp = jsonResult?.value(forKey: "completion") as! String
            if jsonComp == "done" {
            } else {
            }
        }catch{}
    } else {
    }
}.resume()

我只想将超时设置为 20 秒,然后返回错误(警报)。我怎样才能做到这一点?我觉得我已经尝试了所有可能的方法,只是通过配置URLSessionConfiguration,并设置.timeoutInterval

我们将不胜感激!

【问题讨论】:

  • 很明显这个问题是关于 Swift 的标签。标题中包含“Swift”有什么意义?
  • @LeoNatan 对我的帖子进行 -1 是不必要的,因为您认为我将“Swift”放在标题中是错误的。但是要回答您的问题,这仅仅是因为我只想指出该语言是 Swift。我经常做的事情。
  • 你已经指出它在 Swift 中——你有 swiftswift3 标签。此外,这是一个框架问题。您的问题与 Swift 无关。如果是 ObjC 形式的帮助,你真的不想接受吗?
  • @LeoNatan 好的,从现在开始我会避免这样做。

标签: swift swift3 nsurlsession connection-timeout urlrequest


【解决方案1】:

超时应该总是几分钟,而不是二十秒。在蜂窝连接不良时进行 DNS 查找可能需要 20 或 30 秒,而使用 20 秒超时意味着在较差的网络上,您的应用将完全无法使用。

您在 UI 中处理此问题的方式应该完全独立于网络代码。启动请求并同时创建和启动计时器。如果您的会话委托在计时器触发时还没有收到...didReceiveResponse:... 调用,请显示“慢速网络”UI,但让网络请求继续,直到它失败。

此外,如果您的请求是幂等的(也就是说,如果发出两次请求是安全的),您可以考虑使用间隔非常短(例如 5 秒)的第二个计时器,并且如果您没有得到 @ 987654322@在那段时间内调用,并行启动第二个请求。如果第二个任务在您的 20 秒计时器触发时没有得到响应,请取消它。如果它首先得到响应,则取消原始请求。这有助于减少丢包对用户感知延迟的影响。

【讨论】:

  • 好的,感谢您整理出来。我得到它!但是,您是在告诉我在 x 时间之后,请求最终会失败吗?因此,如果我在 'if error == nil { } else { print("something here") }' 中创建警报,控制台将打印 'Something here'?另外,我是否可以在 x 秒后通过我的计时器取消请求?
  • 最终,它可能会失败,在这种情况下,是的,你会被调用一个非零错误。我认为默认是放弃 90 秒而不接收单个字节的数据,但我可能记错了数字。默认情况下根本没有最大总时间,因为这会导致更长的下载失败。
  • 您最终可以取消请求,但您可能不应该这样做。 Apple 的一般建议是,如果用户不再关心数据,则让用户取消请求。否则,假设用户最终想要获取数据,即使需要很长时间。
  • 我明白了。我实际上是通过 Stripe 进行交易。所以我想我会坚持 70 秒的超时时间,以防有些人担心他们的钱会发生什么事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-11
  • 2017-12-01
  • 1970-01-01
  • 2021-03-08
  • 2018-06-18
  • 2018-07-14
相关资源
最近更新 更多