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