Swift NSURLSession完成其作业后转到其他视图
我的问题是,当我尝试在一些api调用完成后转到另一个视图时,它不会转到下一个视图。下面是代码。提前谢谢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:
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退出。