Swift NSURLSession完成其作业后转到其他视图

Swift NSURLSession完成其作业后转到其他视图,swift,viewcontroller,nsurlsession,nsurlsessiondatatask,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:

我的问题是,当我尝试在一些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调用已完成,并且控制台上没有错误。但它不会转到另一个场景。

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

...
dispatch_async(dispatch_get_main_queue(), {

    let navigationVC = self.navigationController
    navigationVC?.pushViewController(weatherView, animated: false)
})
...
我用两行代码编写了代码,以避免swift编译器错误(单语句和闭包返回值:请参阅)。您也可以将其编写为:

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

此代码位于ViewController?中的何处?是否存在
self.navigationController?
或它是
nil
?是的,此代码位于viewDidLoad中。所以navigationController退出。