2017-08-18 10 views
-2

次のコードは間違っていることは知っていますが、私は自分の意図を示したいと思います。 複数回呼び出されるメソッドを記述したいと思います。このフェッチ方法は、成功したかどうかを教えてくれます。関数がインターネットからフェッチして値を返します

func fetch(url: String) -> Bool? { 
    let defaultSession = URLSession(configuration: URLSessionConfiguration.default) 
    let url = URL(string: url) 
    var bool: Bool? = nil 
    if let url = url { 
     defaultSession.dataTask(with: url, completionHandler: { data, response, error in 
      if let error = error { 
       print(error) 
       return 
      } 
      DispatchQueue.main.async { 
       if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data { 
        // handle the data. 
        bool = true 
       } else { 
        print("something really wrong") 
        bool = false 
       } 
      } 
     }).resume() 
    } 
    return bool 
} 

if let bool = fetch(url: "https://www.google.com.hk/webhp?hl=en&sa=X&ved=0ahUKEwimubK7r-HVAhVFmZQKHazMAMMQPAgD"), bool == true { 
    // if it is true, I can go for next step. 
} 
+0

"複数フェッチ"とは何ですか?私はURLが一度使われているのを見るだけです。また 'var bool:Bool? = nilである。オプションはデフォルトで 'nil'です。 'var bool:Bool? 'と書くことができます。 – Honey

+0

私はどちらが間違っているかを知っています。私は 'var'宣言時にはデフォルト値がnilであることを知っています。それは傷です。 –

+0

あなたが知っている部分が間違っているかは不明です。それ以外の場合は修正します。何度も何度もフェッチするという意味ですか? – Honey

答えて

0

API呼び出しの完了時にUIを待機させることはお勧めできません。 API呼び出しの所要時間を制御する機能はありません。ネットワーク接続が不良な状況では、応答に数秒かかることがあります。

このような状況では、完了ハンドラを使用することができます。

func fetch(url: String, completion: @escaping (_ success: Bool) -> Void) { 
    let defaultSession = URLSession(configuration: URLSessionConfiguration.default) 
    let url = URL(string: url) 

    if let url = url { 
     defaultSession.dataTask(with: url, completionHandler: { data, response, error in 
      if let error = error { 
       print(error) 
       return 
      } 

      if let httpResponse = response as? HTTPURLResponse, 200...299 ~= httpResponse.statusCode, let data = data { 
       // handle the data. 
       completion(true) 
      } else { 
       print("something really wrong") 
       completion(false) 
      } 
     }).resume() 
    } 
} 


func testFetch() { 
    fetch(url: "https://www.google.com.hk/webhp?hl=en&sa=X&ved=0ahUKEwimubK7r-HVAhVFmZQKHazMAMMQPAgD") { (success) in 
      // if it is true, I can go for next step. 
     DispatchQueue.main.async { 
      if success { 
       // it was good 
      } 
      else { 
       // not good 
      } 
     } 
    } 
} 
関連する問題