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) 

这有错误没有代表

+0

如何使用网络框架,如Alamofire。它是强大且可用的库,可以解决所有可能性和方法。当在不同的网络环境中应用时,这可能会导致很多错误。 – pedrouan

+1

我现在真的不想使用任何框架,如果我可以帮助它。 – adamprocter

您可以拨打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 
} 
+0

我得到未解析的标识符会话? – adamprocter

+1

adamprocter,请礼貌地提供完整的警告和有问题的路线。 – pedrouan

+0

@Rob啊谢谢对不起,我忘记把最新的代码以及Swift 3的更改,因为我现在不使用NSArrary ... values = try! JSONSerialization.jsonObject(带有:data !,选项:JSONSerialization.ReadingOptions.mutableContainers)as! [[String:AnyObject]] – adamprocter