GTC处理的视图控制器的多个演示

时间:2019-03-11 09:03:02

标签: ios swift

我必须使用具有动画演示文稿/关闭效果的视图控制器作为我的一个项目的加载器视图。

可以从代码中的多个点(一个加载动作的许多入口点)显示此视图控制器。

问题主要是在视图控制器的显示/关闭过程中发生某些事情。也就是说,如果网络请求的速度快于展示/关闭的动画,我会遇到通常的错误“试图关闭正在展示的视图控制器”或类似内容。

这似乎是GCD可以解决的常见问题,但我想知道什么是最干净,最简单的解决方案。

目前,我有一些信号灯,我在动画之前等待,然后在动画之后发出信号,但是我不认为这是针对这种情况的最佳解决方案。

您知道解决此问题的更好方法吗?

遵循我的实现代码:


private let overlayQueue = DispatchQueue(label: "OverlayQueue", qos: .userInitiated, attributes: [], autoreleaseFrequency: .never, target: DispatchQueue.global())

[...]

        self.overlayQueue.async {
            self.overlayQueueSemaphore.wait()

            // Want to show and not yet shown
            if case OverlayStatus.dismissed = self.overlayStatus, show {
                let overlay = WOFOverlayViewController(contentView: newContent)
                self.present(overlay, animated: true) {
                    self.overlayStatus = .presented(overlay)
                    self.overlayQueueSemaphore.signal()
                }
            }
                // Want to show and already shown
            else if case let OverlayStatus.presented(overlay) = self.overlayStatus, show {
                overlay.setContentView(newContent, animated: animated)
                self.overlayQueueSemaphore.signal()
                // Only remaining option is that show is false and I have the overlay
            } else if case let OverlayStatus.presented(overlay) = self.overlayStatus, !show {
                overlay.dismiss(animated: animated) {
                    self.overlayStatus = .dismissed
                    self.overlayQueueSemaphore.signal()
                }
            } else {
                // is not shown and show is false. Nothing to do
                print("Dismissing overlay view that is already dismissed")
                self.overlayQueueSemaphore.signal()
            }
        }

0 个答案:

没有答案