2016-08-20 11 views
1

次のコードはうまくいきますが、データ接続が遅すぎるとタイムアウトを追加する必要があります。Swift 3 URLセッション - 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() 
} 

をあなたの演出とは異なり、これが非同期であること、しかし、気づいたかもしれません。したがって、完了ハンドラパターンを適用する必要があります。そのため、完了時を知ることができます。だから、私は個人的に呼び出し元から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ああ、ありがとう、申し訳ありません。私はNSArraryを現在使用していないので、スイフト3の変更のための最新のコードを入れておくことを忘れてしまいます。 JSONSerialization.jsonObject(with:data!、options:JSONSerialization.ReadingOptions.mutableContainers)を! [[String:AnyObject]] – adamprocter

関連する問題