2017-12-30 67 views
-2

I次のコードを持っている:私はこの関数の呼び出しを行うことは、「通貨利用できません」プリントアウト)が、他の回のコール作品とそれが変換したときに時々はなぜ失敗し、私のAPI呼び出しです

func convert(currencyToConvert:String,amount:Double,currencyToConvertTo:String,date:String)->Double{ 
    makeConnection(date: date) 
    usleep(80000) 
    if let x = currencyRates[currencyToConvert]{ 
     var a = 0.00 
     if currencyToConvert == "USD"{ 
      a = amount*currencyRates["SGD"]! 
     } 
     else { 
      a = (amount*currencyRates[currencyToConvertTo]!)/x 
     } 
     return a 
    } 
    else { 
     print("currency not available") 
     return 0.00 
    } 

} 

func makeConnection(date:String){ 
    currencyRates.removeAll() 

    let url = URL(string: "https://openexchangerates.org/api/historical/\(date).json?app_id=xyz") 

    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 

     if error != nil 
     { 
      print ("ERROR") 
      // ADD SEVERAL URL'S HERE FOR ACCESS HERE 
     } 
     else 
     { 
      if let content = data 
      { 
       do 
       { 
        let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
        if let rates = myJson["rates"] as? NSDictionary 
        { 
         for (key, value) in rates 
         { 
          self.currencyRates[(key as? String)!] = value as? Double 
         } 
        } 
       } 
       catch 
       { 

       } 
      } 
     } 
    } 
    task.resume() 
} 

を通貨。コールが失敗しないようにするにはどうすればよいですか?私は、コールが行われる前に通貨がフェッチするのに十分な時間があることを確認するために遅延を追加しました。

EDIT 1:

[OK]をので、私は睡眠を削除し、whileループを追加したが、これは実際にクラッシュするアプリを引き起こす実行する前に声明

currency not available 

をほぼ200〜300回印刷されますiPhoneで。他の方法でも同様の結果を得るにはどうすればいいですか?

func convert(currencyToConvert:String,amount:Double,currencyToConvertTo:String,date:String)->Double{ 
    makeConnection(date: date) 
    var currencyFetched:Bool = false 
    var a:Double = 0.0 
    repeat { 
    if let x = currencyRates[currencyToConvert]{ 
     if currencyToConvert == "USD"{ 
      a = amount*currencyRates["SGD"]! 
     } 
     else { 
      a = (amount*currencyRates[currencyToConvertTo]!)/x 
     } 
     currencyFetched = true 
     print("currency available") 
     return a 
    } 
    else { 
     print("currency not available") 
     currencyFetched = false 
    } 
    }while currencyFetched == false 
} 
+0

をご 'makeConnection'関数にコールバック/完了ブロックを追加し、データに依存している作業を実行するためにそれを使用... – jcaron

+0

はあなたが私に与えてもらえその構文がどうなるかについての大まかなアイデアです。 –

答えて

0

スレッドスリープはお勧めできません。代わりに、@escapingクロージャを使用することができます。

func convert(currencyToConvert:String ,amount:Double ,currencyToConvertTo:String ,date:String , completion: @escaping((Double?)->())){ 
    currencyRates.removeAll() 
    let url = URL(string: "https://openexchangerates.org/api/historical/\(date).json?app_id=xyz") 
    let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in 
     var result: Double? 
     if let content = data { 
      do { 
       let myJson = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as AnyObject 
       if let rates = myJson["rates"] as? NSDictionary { 
        for (key, value) in rates { 
         self.currencyRates[(key as? String)!] = value as? Double 
        } 
        if let x = currencyRates[currencyToConvert]{ 
         if currencyToConvert == "USD"{ 
          result = amount*currencyRates["SGD"]! 
         } 
         else { 
          result= (amount*currencyRates[currencyToConvertTo]!)/x 
         } 
        } 
       } 
      } catch { 

      } 
     } 
     completion(result) 
    } 
    task.resume() 
} 

最後に使用します。

convert(currencyToConvert: "",amount: 0.0,currencyToConvertTo: "",date:""){ value in 
    if let value = value{ 
     // Use it here 
    } 
} 
+0

非空白関数がvoid関数を返すことができないと言っても機能しませんでした。 –

+0

編集済み...再試行 –

関連する問題