Swift 3 - 异步作业后解除视图控制器

时间:2017-03-04 02:47:02

标签: ios swift xcode swift3 uiviewcontroller

我使用的是Swift 3,Xcode 8.2。

我有一个视图控制器,上面有一个按钮。按下按钮时,它将运行下面的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-03-03 21:37:56.833899 EOB-Reader [27710:6869686] [断言]   transitionViewForCurrentTransition未设置,表示控制器   在演讲期间被解雇了?   (< _UIAlertControllerAlertPresentationController:0x109e3b190>)

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

一次执行任何过渡。

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

如果您在此处设置了任何其他视图/控制器转换操作,请在此处分享。

答案 1 :(得分:0)

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

很快就会用代码更新。