URLSession dataTask超时错误

ask*_*ale 5 urlrequest connection-timeout nsurlsession swift swift3

我目前在尝试将数据发布到Web服务器时遇到有关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()
Run Code Online (Sandbox Code Playgroud)

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

帮助将不胜感激!

dga*_*ood 3

超时时间应始终为几分钟,而不是二十秒。在糟糕的蜂窝连接上进行 DNS 查找可能需要二十或三十秒,而使用二十秒超时意味着在糟糕的网络上,您的应用程序将完全无法使用。

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

didReceiveResponse:此外,如果您的请求是幂等的(即,如果发出两次请求是安全的),您可以考虑使用第二个定时器,间隔非常短(例如 5 秒),并且如果您在该时间内没有接到电话,并行启动第二个请求。如果第二个任务在二十秒计时器启动时没有得到响应,请取消它。如果它首先得到响应,则取消原始请求。这有助于减少数据包丢失对用户感知延迟的影响。