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() 

分享这里,如果你在这里设置任何其他视图/控制器迁移动作。

+0

非常感谢!这对我来说非常合适。你能向我解释你在做什么背后的基本原理吗?我试图了解我为什么遇到问题。 – noblerare

+0

更新我的答案,让我知道,仍然如果你有任何疑问.... – Krunal

+0

谢谢你的编辑! – noblerare

请记住,当你发送异步你通常指派到后台线程,以防止UI阻塞。所有屏幕(UI)组件都需要在主线程上修改。因此,从主线程开始您的进度微调,将您的繁重工作分派到背景,然后重新分派到您想要的主线程。 this.dismissviewcontroller:动画

将很快用代码更新。