从后台线程更改视图控制器

Change View Controller from a background thread

我制作了一个自定义相机应用程序,并使用后台线程进行包含延迟的循环。如果延迟发生在主线程中,它将中断 AVCaptureSession.

我想在循环结束后return到ViewController(应用程序主页)。

    func takeAllPictures() {
        
        DispatchQueue.global(qos: .background).async {
            let frequency = Double(self.pictureFreq)!
            let x = UInt32(frequency)
            let totalTimes = Double(self.pictureTotalTime)! //number of pics
            var picsLeftCount = totalTimes
            
            while picsLeftCount > 0{
                sleep(x)
                self.takePicture()
                picsLeftCount = picsLeftCount - 1
            }
            self.goBackHome()
        }
    }
    func goBackHome() {
        let viewController = storyboard?.instantiateViewController(identifier: Constants.StoryBoard.viewController) as? ViewController
        view.window?.rootViewController = viewController
        view.window?.makeKeyAndVisible()
    }

我的循环一直工作到 goBackHome() 时,我收到一个致命错误,说我只能从主线程执行 goBackHome()

有什么方法可以从后台线程执行 goBackHome() 或更改视图控制器?

我试过使用外部函数,但它们仍然 运行 在后台线程中。

你可以尝试运行主线程中goBackHome函数的内容,像这样:

func goBackHome() {
    DispatchQueue.main.async {
        let viewController = storyboard?.instantiateViewController(identifier: Constants.StoryBoard.viewController) as? ViewController
        view.window?.rootViewController = viewController
        view.window?.makeKeyAndVisible()
    }
}