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
}
をご 'makeConnection'関数にコールバック/完了ブロックを追加し、データに依存している作業を実行するためにそれを使用... – jcaron
はあなたが私に与えてもらえその構文がどうなるかについての大まかなアイデアです。 –