Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从后台线程更改视图控制器_Ios_Swift_Multithreading_Avfoundation - Fatal编程技术网

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

Ios 从后台线程更改视图控制器,ios,swift,multithreading,avfoundation,Ios,Swift,Multithreading,Avfoundation,我制作了一个定制的摄像头应用程序,我使用了一个背景线程来创建一个包含延迟的循环。如果延迟在主线程中,它将中断AVCaptureSession 循环完成后,我想返回到ViewController(应用程序主页) func takeAllPictures() { DispatchQueue.global(qos: .background).async { let frequency = Double(self.pictureFreq)

我制作了一个定制的摄像头应用程序,我使用了一个背景线程来创建一个包含延迟的循环。如果延迟在主线程中,它将中断
AVCaptureSession

循环完成后,我想返回到
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()
        }
    }
我的循环一直工作到
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()
    }
}

聪明的解决方案,谢谢。它不能完全按照您编写的方式工作,只是因为Xcode需要.self处理不同文件/类中的内容,但我编写了一个函数“goHome”,其中包含原始的
goBackHome()
code,然后我从原始
goBackHome()中的新
DispatchQueue.main.async
中调用了
goHome
函数。欢迎光临,很抱歉我没有检查它在Xcode中是否工作。
func goBackHome() {
    DispatchQueue.main.async {
        let viewController = storyboard?.instantiateViewController(identifier: Constants.StoryBoard.viewController) as? ViewController
        view.window?.rootViewController = viewController
        view.window?.makeKeyAndVisible()
    }
}