gpt4 book ai didi

Swift 3 URL Session - 针对 URL 添加超时

转载 作者:搜寻专家 更新时间:2023-11-01 06:38:08 24 4
gpt4 key购买 nike

以下代码运行良好,但如果数据连接太慢,我需要添加超时。

  func preload(){

let url = URL(string: "https://example.com/loadteams.php")
let data = try? Data(contentsOf: url!)

if data == nil{
showAlert()

}else{
values = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [[String : AnyObject]]

}

}

我假设我需要将 URLSession 引入其中,但我不确定该怎么做,我知道它应该是这样的。

 let urlconfig = URLSessionConfiguration.default
urlconfig.timeoutIntervalForRequest = 5
urlconfig.timeoutIntervalForResource = 5
self.session = URLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil)

没有委托(delegate)有错误

最佳答案

你可以调用dataTask(with:):

let session: URLSession = {
let configuration = URLSessionConfiguration.default
configuration.timeoutIntervalForRequest = 5
configuration.timeoutIntervalForResource = 5
return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil)
}()

func preload(completionHandler: @escaping ([[String: AnyObject]]?) -> Void) {
let url = URL(string: "https://example.com/loadteams.php")!

let task = session.dataTask(with: url) { data, response, error in
if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []), let array = json as? [[String: AnyObject]] {
DispatchQueue.main.async {
completionHandler(array)
}
} else {
DispatchQueue.main.async {
completionHandler(nil)
}
}
}
task.resume()
}

不过,您可能已经注意到,与您的再现不同,这是异步的。所以你可能应该应用一个完成处理程序模式,这样你就知道它什么时候完成了。所以,我会亲自从调用者那里进行 UI 更新,例如:

preload() { values in
guard let values = values else {
self.showAlert()
return
}

self.values = values
// trigger whatever UI update you want here
}

关于Swift 3 URL Session - 针对 URL 添加超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39057198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com