2017-05-19 21 views
2
func getLastPriceForFromBtceForPair()->(ethLast:String,btcLast:String){ 

    var btcUSDLast = "" 
    var ethUSDLast = "" 

    let APIURL = "https://btc-e.com/api/3/ticker/btc_usd)" 
    let APIURL2 = "https://btc-e.com/api/3/ticker/eth_usd)" 

    Alamofire.request(APIURL).responseData { (resData) in 

     let prices = JSON(data: resData.result.value!) 


     if let pairGeneral = prices["btc_usd"].dictionaryObject { 

      if let pairLast = pairGeneral["last"] as? Double{ 

        btcUSDLast = String(pairLast) 

      //If I print here I can see the data. 

      } 

     } 

    } 


    Alamofire.request(APIURL2).responseData { (resData2) in 

     let prices2 = JSON(data: resData2.result.value!) 


     if let pairGeneralETH = prices2["eth_usd"].dictionaryObject { 

      if let pairLastETH = pairGeneralETH["last"] as? Double{ 

       ethUSDLast = String(pairLastETH) 

      //If I print here I can see the data. 

      } 

     } 

    } 

    return (btcUSDLast,ethUSDLast) 
} 

これは私のコードです...私はbtc-eからデータを取得しようとしています。ボタンがあり、このボタンが押されると、この関数が呼び出され、ラベルを更新する必要があります。ラベルが更新されない理由は何ですか?

self.ethereumPriceUSDLabel.text = getLastPriceForFromBtceForPair().ethLast 

私は、データが、私は私のラベルはアプリ内で更新を取得することはできませんprinted.Butます私はコードでマークされた場所にprint文を入れた場合、彼らは空です。なぜどんなアイデア?

答えて

1

Alamofire.request(APIURL2).responseDataが非同期メソッドであるため。 {}内のクロージャは、リクエストが実行されるときに、将来のある時点で実行されます。私は、あなたが閉鎖で行われるべき両方の要求を計画し、それらをディスパッチグループに入れることを計画する必要があると思います。そして両方のリクエストが完了すると、メインスレッド上でクロージャ "completion"が実行され、そのクロージャ内のラベルを更新することができます。ディスパッチグループは、両方のリクエストを同時に実行し、両方のリクエストが完了するまで待つことができます。実際の生活では、むしろ2つの機能を実行したいと思っています。しかし、それはあなたのアプリケーションアーキテクチャに依存します。

func getLastPriceForFromBtceForPair(completion: @escaping (_ ethLast:String, _ btcLast:String)->Void){ 

    var btcUSDLast = "" 
    var ethUSDLast = "" 

    let APIURL = "https://btc-e.com/api/3/ticker/btc_usd)" 
    let APIURL2 = "https://btc-e.com/api/3/ticker/eth_usd)" 

    let group = DispatchGroup() 

    group.notify(queue: .main) { 
     completion(btcUSDLast, ethUSDLast) 
    } 

    group.enter() 
    Alamofire.request(APIURL).responseData { (resData) in 

     let prices = JSON(data: resData.result.value!) 

     if let pairGeneral = prices["btc_usd"].dictionaryObject { 
      if let pairLast = pairGeneral["last"] as? Double{ 
       btcUSDLast = String(pairLast) 
      } 
     } 
     group.leave() 
    } 

    group.enter() 
    Alamofire.request(APIURL2).responseData { (resData2) in 

     let prices2 = JSON(data: resData2.result.value!) 

     if let pairGeneralETH = prices2["eth_usd"].dictionaryObject { 
      if let pairLastETH = pairGeneralETH["last"] as? Double{ 
       ethUSDLast = String(pairLastETH) 
      } 
     } 
     group.leave() 
    } 
} 
0

は次のように試してみてください、事前に感謝: -

func getLastPriceForFromBtceForPair()->(ethLast:String,btcLast:String){ 

      var btcUSDLast = "" 
      var ethUSDLast = "" 

      let APIURL = "https://btc-e.com/api/3/ticker/btc_usd)" 
      let APIURL2 = "https://btc-e.com/api/3/ticker/eth_usd)" 

      Alamofire.request(APIURL).responseData { (resData) in 

       let prices = JSON(data: resData.result.value!) 


       if let pairGeneral = prices["btc_usd"].dictionaryObject { 

        if let pairLast = pairGeneral["last"] as? Double{ 

         btcUSDLast = String(pairLast) 




         Alamofire.request(APIURL2).responseData { (resData2) in 

          let prices2 = JSON(data: resData2.result.value!) 


          if let pairGeneralETH = prices2["eth_usd"].dictionaryObject { 

           if let pairLastETH = pairGeneralETH["last"] as? Double{ 

            ethUSDLast = String(pairLastETH) 

            return (btcUSDLast,ethUSDLast) 

           } 

          } 

         } 


        } 

       } 

      } 

     } 
+0

「void関数で予期せぬ非void戻り値が得られます。 – TheTeacher33

関連する問題