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
}
hinzufügen einen Rückruf/Abschluss-Block zu 'makeConnection' Funktion, und verwenden, die die Arbeit auszuführen, die auf den Daten basiert ... – jcaron
Können Sie mir geben ein grobe Vorstellung davon, wie die Syntax dafür ist. –