Измените View Controller из фонового потока - PullRequest
0 голосов
/ 13 июля 2020

Я сделал собственное приложение камеры и использовал фоновый поток для al oop, содержащий задержку. Если бы задержка была в основном потоке, она прервала бы AVCaptureSession.

Я хочу вернуться на ViewController (домашняя страница приложения), когда мой l oop закончится.

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

Мой l oop работает, пока не придет время goBackHome(), где я получаю фатальную ошибку, говоря, что я могу выполнить goBackHome() только из основного потока.

Есть ли способ, которым я могу может выполнять goBackHome() или изменять контроллеры представления из фонового потока?

Я пробовал использовать внешние функции, но они все еще работают в фоновом потоке.

1 Ответ

1 голос
/ 13 июля 2020

Вы можете попробовать запустить содержимое функции goBackHome в основном потоке следующим образом:

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