我必须使用具有动画演示文稿/关闭效果的视图控制器作为我的一个项目的加载器视图。
可以从代码中的多个点(一个加载动作的许多入口点)显示此视图控制器。
问题主要是在视图控制器的显示/关闭过程中发生某些事情。也就是说,如果网络请求的速度快于展示/关闭的动画,我会遇到通常的错误“试图关闭正在展示的视图控制器”或类似内容。
这似乎是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()
}
}