self.ethereumPriceUSDLabel.text = getLastPriceForFromBtceForPair().ethLast
这是我的代码...我正在尝试从btc-e获取数据。我有一个按钮,按下此功能时会调用此函数并更新标签。
{{1}}
如果我将print语句放到我在代码中标记的地方,那么数据就会被打印出来。但是我无法在应用程序中更新我的标签,它们是空的。有什么想法吗?提前致谢
答案 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)
}
}
}
}
}
}
}