无法在 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?

DispatchQueues 是如何在底层实现的?

Swift 5:我无法让我的 UITableView 及时更新(同时使用 `DispatchQueue.global().sync` 和 `DispatchQueue.main.async`

在 Swift 中使用 DispatchQueue 进行同步处理

DispatchQueue.main.async 的初学者问题

类型“DispatchQueue.Attributes”没有成员“序列”