Swift 3 URL Session - 根据URL添加超时
以下代码运行良好,但如果数据连接速度太慢,我需要添加超时。Swift 3 URL Session - 根据URL添加超时
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)
这有错误没有代表
您可以拨打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
}
我得到未解析的标识符会话? – adamprocter
adamprocter,请礼貌地提供完整的警告和有问题的路线。 – pedrouan
@Rob啊谢谢对不起,我忘记把最新的代码以及Swift 3的更改,因为我现在不使用NSArrary ... values = try! JSONSerialization.jsonObject(带有:data !,选项:JSONSerialization.ReadingOptions.mutableContainers)as! [[String:AnyObject]] – adamprocter
如何使用网络框架,如Alamofire。它是强大且可用的库,可以解决所有可能性和方法。当在不同的网络环境中应用时,这可能会导致很多错误。 – pedrouan
我现在真的不想使用任何框架,如果我可以帮助它。 – adamprocter