从后台线程更改视图控制器
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()
}
}
我制作了一个自定义相机应用程序,并使用后台线程进行包含延迟的循环。如果延迟发生在主线程中,它将中断 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()
}
}