如何在Swift中的后台线程上更新UI?

时间:2015-12-24 11:41:19

标签: ios multithreading swift ssh raspberry-pi2

嗨我是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)});
   });

}

有什么建议吗?

1 个答案:

答案 0 :(得分:4)

你打破了在主线程之外弄乱UI对象的黄金法则。从来没有这样做过。在后台执行工作并更新主队列上的UI。 UI /视图控制器/故事板的东西线程安全。

在您的情况下,您尝试从后台队列上的故事板加载视图/视图控制器程序集。这是你的问题。