2016-08-20 1 views
1

Следующий код отлично работает, но мне нужно добавить таймаут, если соединение с данными слишком медленное.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

ответ

3

Вы можете позвонить 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() 
} 

Вы можете заметить, однако, что в отличие от вашего цветопередача, это асинхронный. Поэтому вам, вероятно, следует применить шаблон обработчика завершения, чтобы вы знали, когда это будет сделано. Итак, я лично сделал обновление пользовательского интерфейса от вызывающего абонента, например:

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 Ah спасибо, извините, я забыл поставить последний код, а также для изменений Swift 3, поскольку я не использую NSArrary сейчас ... values ​​= try! JSONSerialization.jsonObject (с: data !, options: JSONSerialization.ReadingOptions.mutableContainers) как! [[String: AnyObject]] – adamprocter

Смежные вопросы