如何在异步请求将数据传递给视图控制器后重新加载视图
How to reload a view after an async request passing data to a view controller
如何在传递数据时发出异步请求后重新加载视图控制器,以便传递给 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 秒 returns,但是到那时 segue 已经推送了新建新的视图控制器。
所以我需要一种方法来刷新视图控制器以更新值....或者除了重新加载新视图控制器之外还有其他方法
尝试:
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// get data here
dispatch_async(dispatch_get_main_queue()) {
// update label here
}
}
我遇到的问题是触发异步请求的按钮也是负责推送到新视图控制器的按钮。
假设我有 viewController1 和 viewController2
所以,我能够检测到故障,而是在 viewController1 和 viewController2 之间创建连接,假设我调用连接 'showOffer'
然后在 JSONAPIResults 函数中我调用了
self.performSegueWithIdentifier("showOffer", sender: nil)
最后,prepareForSegue 看起来还是一样的。
这就是我解决问题的方法
一个可能的解决方法(抱歉没有时间测试它):在你的第一个 ViewController 中声明一个可选的 class 变量类型函数,它接受数组和 return void。在 OfferViewController 中实现接受任何对象数组和 return void 的函数,然后在准备 segue 初始化声明的 class 变量时使用 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
}
如何在传递数据时发出异步请求后重新加载视图控制器,以便传递给 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 秒 returns,但是到那时 segue 已经推送了新建新的视图控制器。 所以我需要一种方法来刷新视图控制器以更新值....或者除了重新加载新视图控制器之外还有其他方法
尝试:
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// get data here
dispatch_async(dispatch_get_main_queue()) {
// update label here
}
}
我遇到的问题是触发异步请求的按钮也是负责推送到新视图控制器的按钮。
假设我有 viewController1 和 viewController2
所以,我能够检测到故障,而是在 viewController1 和 viewController2 之间创建连接,假设我调用连接 'showOffer'
然后在 JSONAPIResults 函数中我调用了
self.performSegueWithIdentifier("showOffer", sender: nil)
最后,prepareForSegue 看起来还是一样的。 这就是我解决问题的方法
一个可能的解决方法(抱歉没有时间测试它):在你的第一个 ViewController 中声明一个可选的 class 变量类型函数,它接受数组和 return void。在 OfferViewController 中实现接受任何对象数组和 return void 的函数,然后在准备 segue 初始化声明的 class 变量时使用 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
}