2017-12-30 44 views
-2

나는 다음과 같은 코드를 가지고 :이 함수를 호출 할이 "통화를 사용할 수 없습니다"출력한다)하지만 다른 시간 통화 작품과는 변환 할 때 때때로왜 실패 내 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() 
} 

을 통화. 전화가 끊어지지 않도록하려면 어떻게해야합니까? 통화가 이루어지기 전에 통화에 충분한 시간을 가져야한다는 지연을 추가했습니다.

편집 1 :

좋아, 그래서 잠을 제거하고 실제로 충돌이 앱을 일으키는 동안 루프하지만 실행하기 전에

currency not available 

거의 200 ~ 300 번 인쇄됩니다 명령문을 추가 아이폰에. 다른 방법을 사용하여 비슷한 결과를 얻으려면 어떻게해야합니까?

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

이'makeConnection' 함수에 콜백/완료 블록을 추가하고 그것을 사용 ... – jcaron

+0

당신은 나에게 줄 수 문법이 어떻게 작동하는지에 대한 대략적인 아이디어. –

답변

0

스레드 수면은 좋지 않습니다. 대신에 @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 
    } 
} 
+0

작동하지 않습니다. void가 아닌 함수가 void 함수를 반환 할 수 없다고 말합니다. –

+0

수정 됨 ... 다시 시도 –