【问题标题】:Go to another view when NSURLSession finishes its job当 NSURLSession 完成它的工作时转到另一个视图
【发布时间】:2014-12-05 15:11:07
【问题描述】:

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

【问题讨论】:

  • 这段代码在哪里,在 ViewController 中?self.navigationController? 存在还是nil
  • 是的,兄弟,它位于 viewDidLoad 中。所以 navigationController 退出了。

标签: swift viewcontroller nsurlsession nsurlsessiondatatask


【解决方案1】:

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

...
dispatch_async(dispatch_get_main_queue(), {

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

我用两行代码编写了代码以避免快速编译器错误(单语句和闭包返回值:参见this)。你也可以这样写:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 2020-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多