嗨我是swift的新手,我想在后台运行一个函数,我的问题是,一旦函数运行,应用程序冻结我就无法使用界面直到函数结束。
StartStream
是一个按钮,它会调用函数self.StreamCam
来传输相机,然后它会将当前视图移动到CAMView
以查看相机界面。
以下是我以前称之为函数的内容:
@IBAction func StartStream(sender: UIButton) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), {
let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("CAMView") as! CAM
let seconds = 2.0
let delay = seconds * Double(NSEC_PER_SEC)
let dispatchTime = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
dispatch_after(dispatchTime, dispatch_get_main_queue(), {
self.StreamCam(self.session)
})
dispatch_async(dispatch_get_main_queue(), {
self.presentViewController(nextViewController, animated:true, completion:nil)});
});
}
有什么建议吗?
答案 0 :(得分:4)
你打破了在主线程之外弄乱UI对象的黄金法则。从来没有这样做过。在后台执行工作并更新主队列上的UI。 UI /视图控制器/故事板的东西不线程安全。
在您的情况下,您尝试从后台队列上的故事板加载视图/视图控制器程序集。这是你的问题。