等到用户响应屏幕视图然后执行代码

时间:2017-01-13 16:36:45

标签: ios swift multithreading swift3 synchronized

所以可能已经有这样的问题,但我找不到类似的问题。

我正在努力做的是,用户是否会收到来自其他设备的邀请。然后会有一个视图会弹出当前视图,要求用户接受或拒绝邀请。

如果用户接受我需要执行操作的邀请,我似乎无法让线程等到用户响应并且我不确定最佳操作方法。

我一直在阅读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将在新的popOver移动到父级时继续运行。但事实并非如此,只要将popOverView推送到屏幕,就会运行最终的print语句。

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

感谢。

1 个答案:

答案 0 :(得分:2)

使用线程而不“等待”。永远不要永远“等待”。 iOS编程是事件驱动的。您的工作是组织您的代码,以便响应适当/期望的事件进行调用。

  

如果用户接受我需要执行操作的邀请

然后通过执行该操作来响应用户点击“接受”按钮。就这么简单。

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