我有一个按钮对象,该对象运行用于计算的后台线程和用于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)
}
}
}
答案 0 :(得分:0)
这种行为可能是由几个不同的问题引起的
您可能同时在此按钮上附加了@IBAction
和segue。确保只有@IBAction
。本身的segue不应附加到按钮上,而应源自场景的“视图控制器”出口(在顶部栏中),而不是来自单元格或按钮。如果是这种情况,请删除现有的segue,然后从场景上方的栏中添加另一个:
然后给该segue一个标识符,您可以随后以编程方式调用它。
或者,“计算代码”以某种方式允许其在完成之前流入DispatchQueue.main.async
调用(即,计算代码正在初始化本身是异步的内容)。
看不到您的代码,我们无法说。但是,从您的后续评论看来,第一个观察结果是您所遇到问题的根源,但是为了将来的读者,我概述了这两种选择。