【问题标题】:Wait until user responds to onscreen view and then execute code等到用户响应屏幕视图然后执行代码
【发布时间】: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


【解决方案1】:

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

如果用户接受邀请,我需要执行一个操作

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

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

【讨论】:

  • 但是当用户单击按钮时,我可以从另一个视图调用方法吗?在我的情况下,当单击按钮时,我需要返回上一个视图,然后切换到另一个视图,这也可能吗?
  • 当然,这一切皆有可能。
猜你喜欢
  • 2020-11-25
  • 2015-09-04
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
相关资源
最近更新 更多