1

我有一个按钮对象,它运行一个用于计算的后台线程和一个用于 UI 更新的主线程。毕竟完成后,我想使用 移动到另一个视图控制器performSegue(withIdentifier: "thirdViewController", sender: self),但它在dispatchQueue. 我之前用过performSegue()很多次在视图控制器之间切换,我总是可以手动控制它。相反,它几乎立即移动到下一个 ViewController,而无需先完成计算。

我尝试使用self.present(thirdViewController(), animated: true, completion: nil), 并self.navigationController?.pushViewController(thirdViewController(), animated: true)更改 ViewController 但他们只是给了我一个黑屏。

@IBAction func generateText(_ sender: Any) {
    DispatchQueue.global(qos: .userInteractive).async {
        //computation code
        DispatchQueue.main.sync {
            //update UI code
            self.performSegue(withIdentifier: "Segue2", sender: self)
        }
    }
}
4

1 回答 1

0

这种行为可能是由几个不同的问题引起的

  1. 您可能同时@IBAction在此按钮上附加了 an 和 segue。确保您只有@IBAction. segue 本身不应该附加到按钮上,而应该来自场景的“视图控制器”出口(在顶部栏中)而不是来自单元格或按钮。如果是这种情况,请删除现有的 segue,并从场景上方的栏中添加另一个:

    在此处输入图像描述

    然后给那个 segue 一个标识符,然后你可以以编程方式调用它。

  2. 或者,“计算代码”以某种方式允许它在完成之前流向DispatchQueue.main.async调用(即计算代码正在启动本身就是异步的东西)。

没有看到你的代码,我们不能说。但是,听起来,从您随后的评论来看,第一个观察结果是您案例中问题的根源,但为了未来的读者,我已经概述了这两种选择。

于 2019-08-14T04:50:58.893 回答