所以可能已经有这样的问题,但我找不到类似的问题。
我正在努力做的是,用户是否会收到来自其他设备的邀请。然后会有一个视图会弹出当前视图,要求用户接受或拒绝邀请。
如果用户接受我需要执行操作的邀请,我似乎无法让线程等到用户响应并且我不确定最佳操作方法。
我一直在阅读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语句。
有谁知道这里最好的行动方案?
感谢。
答案 0 :(得分:2)
不使用线程而不“等待”。永远不要永远“等待”。 iOS编程是事件驱动的。您的工作是组织您的代码,以便响应适当/期望的事件进行调用。
如果用户接受我需要执行操作的邀请
然后通过执行该操作来响应用户点击“接受”按钮。就这么简单。
毕竟,这就是UIAlertController的视图行为。没有代码暂停或“等待”只是因为警报已启动。您的代码响应到用户事件,即用户点击警报中的按钮。