如何在异步请求将数据传递给视图控制器后重新加载视图

时间:2015-01-23 09:40:24

标签: ios swift uiviewcontroller

如何在传递数据时发出异步请求后重新加载视图控制器,以便在数据可用时,传递给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已经推送到新的视图控制器。 所以我需要一种刷新视图控制器来更新值的方法....或者除了重新加载新的视图控制器之外还有其他方法

3 个答案:

答案 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仍然看起来一样。 这就是我能够解决问题的方法