PopUp和Dispatch异步的快速计时

时间:2018-05-29 20:11:17

标签: swift popup dispatch-async

我是一名初学者swiftprogrammer,他遇到了函数调用时间问题。我想解释为什么会发生这种情况以及解决问题的方法。问题出现在一个弹出窗口关闭时运行的代码段,我想先打开另一个弹出窗口,然后在新弹出窗口中按下一个按钮后,我希望程序在主视图控制器中另外执行一些操作。这是代码(有人建议使用DispatchQue,但它似乎没有做任何事情):

@objc func onPopupClosed() {
print("first")

DispatchQueue.main.async {
 if let vc = self.storyboard?.instantiateViewController (withIdentifier: 
    "P2CompetitionPopUpId") as? P2_Competition_Pop_Up 
            {
                vc.modalPresentationStyle = .overCurrentContext
                self.present(vc, animated: true, completion: nil)
            } else {
                print("error creating P2_Competion_Pop_Up")
            }
        }
print ("third")     
}

P2_Competition_Pop_Up如下所示:

class P2_Competition_Pop_Up: UIViewController {

 override func viewDidLoad() {
    super.viewDidLoad()

    //print("Second")
 }

@IBAction func Slot1(_ sender: Any) {

    //some code

    dismiss(animated: true, completion: nil)

}
}

我希望这个程序能够产生输出"首先" "第二" "第三" (并且只有在弹出窗口中按下按钮后才能打印"第三个")。相反,它给了我"第一" "第三" "第二&#34 ;.为什么?我该如何解决?使用DispatchQue是正确的方法还是另一个?

PS。 "打印("第三")"声明实际上是对主视图外观的修改。我只是用这句话突出了订单难度并简化了插图。

1 个答案:

答案 0 :(得分:0)

在您的代码中没有保证,第二个"或"第三"将先打印。 但是,如果您在提交UIViewController之后想要完成某项内容,则应该在present完成块中执行此操作。

    if let vc = self.storyboard?.instantiateViewController (withIdentifier: "P2CompetitionPopUpId") as? P2_Competition_Pop_Up {
      vc.modalPresentationStyle = .overCurrentContext
      self.present(vc, animated: true, completion: {
          // do it here
          print ("third")     
      })
    } else {
      print("error creating P2_Competion_Pop_Up")
    }

你也可以写糖语法

      self.present(vc, animated: true) {
          print ("third")     
      }