2016-10-11 14 views
0

私はwhich-限り、私はunderstand-として、このコードを持っては非同期です:Swift3でHTTP結果を同期して返す方法は?

func testConnection() -> Bool { 
    let url = URL(string: uri)! 
    let task = URLSession.shared.dataTask(with: url) { 
     (data, response, error) in 

     guard let data = data, let _:URLResponse = response , error == nil else { 
      print("error") 
      return 
     } 

     let dataString = String(data: data, encoding: String.Encoding.utf8) 
    } 

    task.resume() 
} 

どのように送信者にtestConnection結果を返すことができます同期バージョンになりますか?

+0

[Swift関数で非同期呼び出しからデータを返す]の可能な複製(http://stackoverflow.com/questions/25203556/returning-data-from-async-call-in-swift-function) – vadian

+1

私はあなたが同期版がほしい理由は何ですか?あまり複雑にしないで、代わりにネットワーク要求と非同期を考えるようにしてください。 – Wilson

答えて

-2

あなたは終了する非同期呼び出しを待つためにセマフォを使用することができます。

func testConnection() -> Bool { 
    let url = URL(string: uri)! 
    var dataStringOrNil: String? 
    let semaphore = DispatchSemaphore(value: 0) 

    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in 
     defer { 
      semaphore.signal() 
     } 

     guard let data = data, error == nil else { 
      print("error") 
      return 
     } 

     dataStringOrNil = String(data: data, encoding: .utf8) 
    } 

    task.resume() 
    semaphore.wait() 

    guard let dataString = dataStringOrNil else { 
     return false 
    } 

    // some substring checking 
    return dataString.contains("href") 
} 

私はそれをお勧めしませんが、同期呼び出しの理由が考えられます。コマンドラインツールで使用することがあります。

関連する問題