无法在dispatchqueue中手动控制performSegue()

时间:2019-08-07 18:41:07

标签: ios swift xcode segue dispatch-queue

我有一个按钮对象,该对象运行用于计算的后台线程和用于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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

    enter image description here

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

  2. 或者,“计算代码”以某种方式允许其在完成之前流入DispatchQueue.main.async调用(即,计算代码正在初始化本身是异步的内容)。

看不到您的代码,我们无法说。但是,从您的后续评论看来,第一个观察结果是您所遇到问题的根源,但是为了将来的读者,我概述了这两种选择。