无法在调度队列中手动控制 performSegue()
cant manually control performSegue() inside dispatchqueue
我有一个按钮对象,它运行一个用于计算的后台线程和一个用于 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)
}
}
}
这种行为可能是由几个不同的问题引起的
您可能同时将 @IBAction
和 segue 附加到此按钮。确保你只有 @IBAction
。 segue 本身不应附加到按钮,而应源自场景的“视图控制器”出口(在顶部栏中)而不是来自单元格或按钮。如果是这种情况,请删除现有的 segue,并从场景上方的栏中添加另一个:
然后为该 segue 提供一个标识符,然后您可以通过编程方式调用该标识符。
或者,“计算代码”以某种方式允许它在完成之前流向 DispatchQueue.main.async
调用(即计算代码正在启动本身就是异步的东西)。
没有看到你的代码,我们不能说。但是,从你随后的评论来看,第一个观察结果似乎是你案例中问题的根源,但为了未来的读者,我已经概述了这两种选择。
我有一个按钮对象,它运行一个用于计算的后台线程和一个用于 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)
}
}
}
这种行为可能是由几个不同的问题引起的
您可能同时将
@IBAction
和 segue 附加到此按钮。确保你只有@IBAction
。 segue 本身不应附加到按钮,而应源自场景的“视图控制器”出口(在顶部栏中)而不是来自单元格或按钮。如果是这种情况,请删除现有的 segue,并从场景上方的栏中添加另一个:然后为该 segue 提供一个标识符,然后您可以通过编程方式调用该标识符。
或者,“计算代码”以某种方式允许它在完成之前流向
DispatchQueue.main.async
调用(即计算代码正在启动本身就是异步的东西)。
没有看到你的代码,我们不能说。但是,从你随后的评论来看,第一个观察结果似乎是你案例中问题的根源,但为了未来的读者,我已经概述了这两种选择。