2017-12-30 38 views
-2

Ich habe den folgenden Code:Warum sind meine API-Aufrufe Versagen

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() 
} 

Manchmal, wenn ich einen Aufruf dieser Funktion machen es ausdruckt „Währung nicht verfügbar“) aber auch andere Zeiten der Aufruf funktioniert und es wandelt die Währung. Was kann ich tun, damit der Anruf nicht fehlschlägt? Ich habe sogar eine Verzögerung hinzugefügt, um sicherzustellen, dass die Währungen genug Zeit haben, um zu holen, bevor der Anruf getätigt wird.

EDIT 1:

Ok, so entfernte ich den Schlaf und hat eine while-Schleife, aber die Aussage

currency not available 

fast 200-300 mal gedruckt wird, bevor diese ausgeführt wird, die tatsächlich die App zum Absturz bringt auf einem iPhone. Wie kann ich mit anderen Methoden ähnliche Ergebnisse erzielen?

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

hinzufügen einen Rückruf/Abschluss-Block zu 'makeConnection' Funktion, und verwenden, die die Arbeit auszuführen, die auf den Daten basiert ... – jcaron

+0

Können Sie mir geben ein grobe Vorstellung davon, wie die Syntax dafür ist. –

Antwort

0

Thread Schlaf ist keine gute Idee. Stattdessen können Sie @escaping Verschlüsse verwenden.

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() 
} 

Schließlich verwenden:

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

Hat nicht funktioniert es sagt, nicht-void-Funktion kann keine Void-Funktion zurückgeben. –

+0

Bearbeitet ... wiederholen –

Verwandte Themen