【发布时间】: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函数添加一个回调/完成块,并使用它来执行依赖数据的工作... -
你能给我一个关于语法的粗略想法吗?