0

我的问题是,当我在某些 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 调用完成并且控制台上没有错误。但它并没有进入另一个场景。

4

1 回答 1

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
})
...
于 2014-12-05T17:17:36.927 回答