首页 > 解决方案 > 展开 Segue 和多线程

问题描述

视图控制器从父视图控制器以模态方式启动,如果按下三个按钮之一,则稍后展开到其父视图:

@IBAction func parentSelected(_ sender: UIButton) {
    switch sender.tag {
    case 1:
        parentType = ParentStoryboardId.meetings
    case 2:
        parentType = ParentStoryboardId.accounts
    case 3:
        parentType = ParentStoryboardId.contacts
    default:
        parentType = ParentStoryboardId.accounts
    }
    self.performSegue(withIdentifier: "unwindToNotes", sender: self)
}

父 VC 中的 unwind segue 处理程序然后启动另一个带有条目列表的 Table VC:

@IBAction func unwindToNotes(sender: UIStoryboardSegue) {
     if let sourceViewController = sender.source as? SelectParentVC {
         DispatchQueue.main.async {
            guard let parentType = sourceViewController.parentType 
             else {
                return
             }
            self.parentSelected = parentType
            self.displayParents(parentType)
            self.selectParentView.isHidden = true
          }
     }
 }

最初,在父 VC 中执行 unwind segue 处理程序调用的所有 UI 操作时,我没有指定主队列。并且我试图调用的列表视图没有显示,尽管调试确认列表 VC 正在部分执行。

似乎从 unwind segue 处理程序调用的一些 UI 操作被降级到后台线程。我试图弄清楚这是如何发生的,因为导致“展开”操作的所有操作都没有在后台线程上显式运行。任何见解或链接将不胜感激!

标签: iosswiftmultithreadinguiviewcontroller

解决方案


您的问题不在于您没有在主队列上运行。你的问题是你试图呈现一个新的视图控制器,而一个正在被解雇的过程中。

通过使用 aDispatchQueue.main.async您会导致视图控制器的呈现发生在主运行循环的下一次迭代中,在前一个视图控制器已被解除之后。


推荐阅读