Swift 3 - 异步作业后关闭视图控制器
我正在使用Swift 3,Xcode 8.2。Swift 3 - 异步作业后关闭视图控制器
我有一个视图控制器上有一个按钮。当按下按钮时,它运行下面的buttonPressed
函数。它启动一个异步作业,需要几秒钟的时间完成一个旋转齿轮活动指示器弹出。一旦工作完成,我希望活动指示器解散,并且视图控制器也要解散它最初来自的VC。
func buttonPressed() {
// Set up some stuff here
...
// this code block here is to asynchronously run the processing job
// while the activity indicator gear spins
self.displaySpinningGear()
DispatchQueue.main.async {
self.doSomeJobProcessing()
}
self.dismiss(animated: true, completion: nil)
// also dismiss the camera view
self.presentingViewController?.dismiss(animated: true, completion: nil) // error here
}
但是,我得到的是最后一条语句错误:
[断言]试图解雇而 转变已经呈现控制器。 (< _UIAlertControllerAlertPresentationController:0x109e3b190>) 2017年3月3日21:37:56.833899 EOB读取器[27710:6869686] [断言] transitionViewForCurrentTransition没有被设置,呈现控制器 是在演示期间驳回? (< _UIAlertControllerAlertPresentationController:0x109e3b190>)
任何帮助,将不胜感激。
一次执行任何人的这些转换。
if let viewController = presentingViewController {
// This block will dismiss both current and a view controller presenting current.
viewController.dismiss(animated: true, completion: nil)
} else {
// This block will dismiss only current view controller
self.dismiss(animated: true, completion: nil)
}
两个转换操作不能同时执行。
在您的源代码中,您将忽略当前具有动画的视图控制器。现在动画通常需要大约0.25秒的时间来完成其操作。
现在,在下一行,你试图关闭那些已提出当前视图控制器(**)视图控制器。 (在你的情况下(**)视图控制器也由其他视图控制器提供),因此,在几分之一秒/毫秒内(**),视图控制器也将尝试用动画自行消除它。
此时您当前的视图控制器正在被解雇,并且(**)视图控制器也将开始解雇操作。因此,两个操作在主执行线程上相互冲突。而结果成为一个问题,你正面临着。
而且,分享您的代码块
self.doSomeJobProcessing()
分享这里,如果你在这里设置任何其他视图/控制器迁移动作。
请记住,当你发送异步你通常指派到后台线程,以防止UI阻塞。所有屏幕(UI)组件都需要在主线程上修改。因此,从主线程开始您的进度微调,将您的繁重工作分派到背景,然后重新分派到您想要的主线程。 this.dismissviewcontroller:动画
将很快用代码更新。
非常感谢!这对我来说非常合适。你能向我解释你在做什么背后的基本原理吗?我试图了解我为什么遇到问题。 – noblerare
更新我的答案,让我知道,仍然如果你有任何疑问.... – Krunal
谢谢你的编辑! – noblerare