【问题标题】:Why are my API Calls failing为什么我的 API 调用失败
【发布时间】:2018-06-10 11:31:51
【问题描述】:

我有以下代码:

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

有时当我调用此函数时,它会打印出“货币不可用”),但其他时候调用有效并且它会转换货币。我可以确保做什么才能使通话不会失败?我什至添加了延迟,以确保在调用之前货币有足够的时间提取。

编辑1:

好的,所以我删除了睡眠并添加了一个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
}

【问题讨论】:

  • 向您的makeConnection 函数添加一个回调/完成块,并使用它来执行依赖数据的工作...
  • 你能给我一个关于语法的粗略想法吗?

标签: ios api swift3


【解决方案1】:

线程休眠不是一个好主意。取而代之的是,您可以使用 @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
     }
}

【讨论】:

  • 不起作用,它说非 void 函数不能返回 void 函数。
  • 已编辑...重试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2019-03-02
相关资源
最近更新 更多