2017-01-13 53 views
-1

因此,可能已经有这样的问题,但我无法找到类似的问题。等待用户回复屏幕视图,然后执行代码

我正在尝试做的事情很多,用户是否会收到来自其他设备的邀请。然后会出现一个视图,弹出当前视图,要求用户接受或拒绝邀请。

但是,如果用户接受邀请,我需要执行一个操作,但是我似乎无法让线程等待,直到用户响应,我不确定最佳操作过程。

我一直在阅读GCD,看看能不能从中找出解决方案,但之前我从未使用过GCD,但无法弄清楚。

这里是我的代码,这是一个方法中:

 DispatchQueue.global().async(execute: { 

      DispatchQueue.main.sync { 
       print("\(#file) > \(#function) > In new thread: \(Thread.current)") 

       let popOverView = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "IncomingCall") as! IncomingCallViewController 
       self.addChildViewController(popOverView) 

       popOverView.peerIndex = self.getIndexForPeer(peer: fromPeer) 
       popOverView.messages = self.messages 

       popOverView.view.frame = self.view.frame 
       self.view.addSubview(popOverView.view) 
       popOverView.didMove(toParentViewController: self) 

       print("\(#file) > \(#function) > Finished synchronized code on thread: \(Thread.current)") 
      } 

      print("\(#file) > \(#function) > \(Thread.current))") 
      // Need to execute some code HERE when the user responds 
     }) 

我希望的是,在运行中的代码的线程:DispatchQueue.main.sync将继续运行,当新酥料饼移到父母。但事实并非如此,只要popOverView被推到屏幕上,最后的打印语句就会运行。

有没有人知道这里最好的行动方案?

谢谢。

+0

你根本就不应该使用GCD。你可以做的就是调用PopOver上的一个闭包,该闭包由用户在PopOver上点击一个UIButton触发。在那个封闭中你会执行你的行动。 – mattsson

+0

@mattsson嗯..好的,我必须查看关闭,我从来没有使用过它们。我还应该注意到,当用户单击接受按钮时,PopOverView消失,然后我们需要执行一个segue到另一个视图。这会改变什么吗? – Logan

+0

那么,你不必使用闭包。设置一个目标和选择器,也就是一个方法,当点击UIButton时会触发('addTarget:action:forControlEvents:')。只要您将另一个视图设置为UIButton的目标,视图就会消失就没关系。 – mattsson

回答

2

不是使用线程和不要“等待”。永远永远不会“等待”。 iOS编程为事件驱动。你的工作是组织你的代码被调用以响应适当的/期望的事件。

如果用户接受,我需要执行一个动作

然后用户通过执行该操作轻敲接受按钮回应邀请。就这么简单。

这毕竟是UIAlertController视图的行为方式。没有代码暂停或“等待”,只是因为警报已启动。您的代码对用户事件做出响应,即用户轻击警报中的按钮。

+0

但是,当用户点击一个按钮时,我可以从另一个视图调用一个方法吗?在我的情况下,当按钮被点击时,我需要返回到前一个视图,然后继续看另一个视图,这是否也有可能? – Logan

+0

当然,所有这一切都是可能的。 – matt