放松Segue和Mutl-Threading

时间:2018-06-05 18:42:19

标签: ios swift multithreading uiviewcontroller

视图控制器是从父视图控制器以模态方式启动的,如果按下其中一个按钮,它将在以后展开:

@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中的展开segue处理程序然后启动另一个带有条目列表的表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中的展开segue处理程序调用的所有UI操作时,我没有指定主队列。虽然调试确认列表VC正在部分执行,但我试图调用的列表视图没有显示。

似乎从unwind segue处理程序调用的一些UI操作被降级为后台线程。我试图弄清楚这是怎么发生的,因为没有一个操作导致"放松"操作是在后台线程上显式运行的。任何见解或链接将非常感谢!

1 个答案:

答案 0 :(得分:1)

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

使用DispatchQueue.main.async导致视图控制器的呈现在主runloop的下一次迭代中发生,在前一个视图控制器被解除之后。