swift - 处理 URLSession 超时

标签 swift timeout session-timeout urlsession

我使用 URLSession 进行 POST 请求并获取玩家列表,但有时我会获取错误“Error Domain=NSURLErrorDomain Code=-1001”,我该如何处理?
我如何在“完成”中出错?

func addPlayer(playerCode: String, completion: @escaping (Error?) -> ()) {
    guard let url = URL(string: "\(url)") else { return }
    
    var urlRequest = URLRequest(url: url)
    urlRequest.httpMethod = "POST"
    
    let playerCode = [playerCode]
    
    let params = ["players": playerCode]
    do {
        let data = try JSONSerialization.data(withJSONObject: params, options: .init())
        
        urlRequest.httpBody = data
        urlRequest.setValue("application/json", forHTTPHeaderField: "content-type")
        
        let sessionConfig = URLSessionConfiguration.default
        sessionConfig.timeoutIntervalForRequest = 5.0
        
        DispatchQueue.global(qos: .background).async {
        URLSession(configuration: sessionConfig).dataTask(with: urlRequest) { (data, resp, err) in
    
            guard let data = data else { return }
            guard let resp = resp else { return }

            print(data)
            print(resp)
            
            guard let response = resp as? HTTPURLResponse, (200 ..< 530) ~= response.statusCode else {
                print("Error: HTTP request failed")
                return
            }
            
            if response.statusCode == 200 {
                print("Status code is 200")
                do {
                    let json = try JSONDecoder().decode(ListOfPlayers.self, from: data)

                    // I am do what I am want

                
                } catch let jsonError {
                    print("Error json serialization \(jsonError)")
                }
                
                    completion(nil)
            } else if response.statusCode == 422 {
                print("Status code is 422")
                    completion(nil)
                return
            }
  
    }.resume()
    }
    } catch {
    }
}
我也尝试使用此代码:
 guard let err = err else { return }
            if (err._code == -1001) {
                print("Oops bad connection")
            }
但此代码不会在“超时”期间执行

最佳答案

您可以将错误转换为 URLError键入然后使用 code属性以安全地检查它是否是 session 超时错误:

if (err as? URLError)?.code == .timedOut {
    // Handle session timeout
}

关于swift - 处理 URLSession 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64884132/

相关文章:

swift - 没有绑定(bind)器的 RxSwift 自定义数据类型转换

php - exec() 超时

algorithm - 客户端服务器系统中的退避机制模式

swift - AVAudioRecorder从不录音

swift - 如何检查表计数并在 swift iOS 的 if 语句中使用它

ios - 我的位置未显示在 MapKit 的 map 上

apache - 无法从 Kafka 生产者连接到远程动物园管理员

php - PHP 中默认的 session 过期时间是多少?

Paypal 支付标准到期

java - 如何在不重置 tomcat session 超时的情况下执行经过身份验证的 AJAX 请求?