URLSession dataTask超时错误

问题描述 投票:3回答:1

我目前遇到关于URLSession一些问题,而试图将数据发布到我的Web服务器。然而,这完美的作品。什么好像不行,是我设置的超时。这是我的整个应用程序,而至关重要的,因为我不希望用户为“加载”永远的,没有任何类型的错误消息。这里是我的代码:

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 swift3 nsurlsession connection-timeout urlrequest
1个回答
2
投票

超时应该总是几分钟的时间长,没有到20秒,它可能需要二三十秒的时间来办不好的蜂窝连接上的DNS查找,并使用二十二分之一超时意味着恶劣的网络上,您的应用程序将完全无法使用。

您在UI处理这个问题的方法应该是完全独立的网络代码。启动请求,并同时创建和启动一个定时器。如果您的会话代理已经不是由时间得到一个...didReceiveResponse:...通话计时器火灾,显示“慢速网络” UI,而是让网络请求继续下去,直到它失败。

另外,如果您的请求是幂等(即,如果发出请求两次是安全的),你可能会考虑与一个很短的时间间隔(如5秒),第二计时器,如果你还没有得到内的一个didReceiveResponse:通话时间,启动并联的第二请求。如果第二个任务没有得到的时候你的第二十二届定时器触发的响应,取消它。如果是第一次获得响应,取消原来的请求。这可以帮助减少数据包丢失对用户感知延迟的影响。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.