标签没有更新,为什么?

时间:2017-05-19 11:23:41

标签: swift alamofire

 self.ethereumPriceUSDLabel.text =  getLastPriceForFromBtceForPair().ethLast

这是我的代码...我正在尝试从btc-e获取数据。我有一个按钮,按下此功能时会调用此函数并更新标签。

{{1}}

如果我将print语句放到我在代码中标记的地方,那么数据就会被打印出来。但是我无法在应用程序中更新我的标签,它们是空的。有什么想法吗?提前致谢

2 个答案:

答案 0 :(得分:1)

因为Alamofire.request(APIURL2).responseData是一种异步方法。当请求完成时,{}中的闭包将在将来的某个时间点执行。我认为你需要计划两个关闭请求并将它们放在一个调度组中。当两个请求都完成后,它将执行关闭"完成"在主线程上,以便您可以更新该闭包中的标签。调度组使您能够同时执行两个请求并等待两个请求完成。在现实生活中,我宁愿做两个功能:每个请求一个。但这完全取决于您的应用架构。

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

答案 1 :(得分: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)

                                }

                            }

                        }


                    }

                }

            }

        }