如何在传递数据时发出异步请求后重新加载视图控制器,以便在数据可用时,传递给UILabel的数据将使用新值进行更新。
这是使用
从API获取响应的函数let searchResultsData: AnyObject = []
func JSONAPIResults(results: AnyObject) {
dispatch_async(dispatch_get_main_queue(), {
self.searchResultsData = results
// This will output an object in the form
// { offer: 12345,
/// currency: USD
//}
})
}
所以,当我对这样的新视图控制器进行prepareForSegue调用时,
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "showOffer") {
if self.searchResultsData.count != 0 {
(segue.destinationViewController as OfferViewController).toPass = currency
}
}
}
我想将货币的值传递给新的视图控制器...但是异步请求的响应总是在返回前最多延迟5秒,但到那时segue已经推送到新的视图控制器。 所以我需要一种刷新视图控制器来更新值的方法....或者除了重新加载新的视图控制器之外还有其他方法
答案 0 :(得分:0)
TRY:
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// get data here
dispatch_async(dispatch_get_main_queue()) {
// update label here
}
}
答案 1 :(得分:0)
一种可能的解决方法(抱歉没时间测试它):在你的第一个ViewController声明一个可选的类变量类型函数,它接受数组并返回void。在OfferViewController实现函数中,取任何对象的数组并返回void然后准备用于使用OfferViewController的新函数初始化声明的类变量并在JSONAPIResults方法上调用该函数。可能你的代码应该看起来像这样:
//first view controller
var updateFunction : ((searchResultsData:[AnyObject]) -> Void)?
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == "showOffer") {
updateFunction = (segue.destinationViewController as OfferViewController).updateFunction
}
}
func JSONAPIResults(results: AnyObject) {
dispatch_async(dispatch_get_main_queue(), {
self.searchResultsData = results
if(self.updateFunction != nil){
self.updateFunction(searchResultsData)
}
})
}
//OfferViewController
func udpateFunction(searchResultsData:[AnyObject]){
//update all views that need to be updated with values of searchResultsData
}
答案 2 :(得分:-1)
我遇到问题的是,触发异步请求的按钮也是负责推入新视图控制器的按钮。
假设我有viewController1和viewController2
所以,我能够检测到错误,而是在viewController1和viewController2之间创建一个连接,比如我调用连接' showOffer'
在JSONAPIResults函数中,我调用了
self.performSegueWithIdentifier("showOffer", sender: nil)
最后,prepareForSegue仍然看起来一样。 这就是我能够解决问题的方法