当NSURLSession完成其工作时转到另一个视图

时间:2014-12-05 15:11:07

标签: swift viewcontroller nsurlsession nsurlsessiondatatask

我的问题是当我在一些api调用结束后尝试去另一个视图时,它不会进入下一个视图。这是下面的代码。提前谢谢。

var task = NSURLSession.sharedSession().dataTaskWithURL(url!, completionHandler: {
    (data, response, error) in //println(response)
    //println(error)
    self.myWeather.apiCallData = JSON(data: data)
    self.myWeather.apiCallError = error

    println("api call finished")

    if error == nil {
        println("no error")
        let weatherView = self.storyboard?.instantiateViewControllerWithIdentifier("WeatherView") as WeatherViewController
        weatherView.myWeather = self.myWeather
        self.navigationController?.pushViewController(weatherView, animated: false)
    }
}).resume()    

打印api调用完成,控制台没有错误。但它没有进入另一个场景。

1 个答案:

答案 0 :(得分:2)

问题是dataTaskWithURL方法的完成处理程序代码在后台辅助线程中运行,而不是在主线程中运行(可能发生视图控制器转换)。 在主线程队列闭包中包含对pushViewController的调用:

...
dispatch_async(dispatch_get_main_queue(), {

    let navigationVC = self.navigationController
    navigationVC?.pushViewController(weatherView, animated: false)
})
...

我已经用两行编写代码来避免swift编译器错误(单个语句和闭包返回值:请参阅this)。你也可以把它写成:

...
dispatch_async(dispatch_get_main_queue(), {
    (self.navigationController)?.pushViewController(weatherView, animated: false)
    return
})
...