【发布时间】:2017-01-13 16:36:44
【问题描述】:
所以可能已经有这样的问题,但我找不到类似的问题。
几乎我想要做的是,用户将收到来自另一台设备的邀请。然后会有一个视图弹出当前视图,要求用户接受或拒绝邀请。
如果用户接受了我需要执行操作的邀请,我似乎无法让线程等到用户响应并且我不确定最佳操作方案。
我一直在阅读 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 被推到屏幕上,最终的打印语句就会运行。
有人知道这里的最佳行动方案吗?
谢谢。
【问题讨论】:
-
您根本不应该为此使用 GCD。您可以做的是调用由用户点击 PopOver 上的 UIButton 触发的 PopOver 关闭。在该闭包中,您将执行您的操作。
-
@mattsson 嗯.. 好的,我得查一下闭包,我以前从未使用过它们。我还应该注意,当用户单击 Accept 按钮时,PopOverView 会消失,然后我们需要对另一个视图执行 segue。这有什么改变吗?
-
好吧,你不必使用闭包。只设置一个目标和选择器可能更有意义,即一个方法,当 UIButton 被点击时触发(
addTarget:action:forControlEvents:)。只要您将另一个视图设置为 UIButton 的目标,视图就会消失是可以的。
标签: ios swift multithreading swift3 synchronized