无法在 dispatchqueue 中手动控制 performSegue()
Posted
技术标签:
【中文标题】无法在 dispatchqueue 中手动控制 performSegue()【英文标题】:cant manually control performSegue() inside dispatchqueue 【发布时间】:2019-08-07 18:41:07 【问题描述】:我有一个按钮对象,它运行一个用于计算的后台线程和一个用于 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)
【问题讨论】:
不要.sync
。 computation code
是异步的吗?
userInteractive
qos 是mainQueue
感谢您的帮助,原来我将 performSegue() 函数绑定到按钮,因为我不知道您可以将 segue 绑定到视图控制器(noob alert),代码现在按预期工作。
我们能否将其标记为已关闭,或者找到答案的人将其写为答案并接受它,这样我们就知道这个问题已经解决了:)
【参考方案1】:
这种行为可能是由几个不同的问题引起的
您可能同时在此按钮上附加了 @IBAction
和 segue。确保您只有@IBAction
。 segue 本身不应该附加到按钮上,而应该来自场景的“视图控制器”出口(在顶部栏中)而不是来自单元格或按钮。如果是这种情况,请移除现有的 segue,然后从场景上方的栏中添加另一个:
然后给那个 segue 一个标识符,然后你可以通过编程方式调用它。
或者,“计算代码”以某种方式允许它在完成之前流向 DispatchQueue.main.async
调用(即,计算代码正在启动本身异步的东西)。
没有看到你的代码,我们不能说。但是,从您随后的 cmets 看来,第一个观察结果是您案例中问题的根源,但为了未来的读者,我已经概述了这两个选项。
【讨论】:
以上是关于无法在 dispatchqueue 中手动控制 performSegue()的主要内容,如果未能解决你的问题,请参考以下文章
当更新我的 UI 以响应异步操作时,我应该在哪里调用 DispatchQueue?
Swift 5:我无法让我的 UITableView 及时更新(同时使用 `DispatchQueue.global().sync` 和 `DispatchQueue.main.async`
在 Swift 中使用 DispatchQueue 进行同步处理