【问题标题】:How do I update the UI on a background thread in Swift?如何在 Swift 的后台线程上更新 UI?
【发布时间】:2016-03-30 20:48:28
【问题描述】:

嗨,我是 swift 新手,我想在后台运行一个函数,我的问题是,一旦函数运行,hole 应用程序就会冻结,直到函数结束,我才能使用界面。

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

}

有什么建议吗?

【问题讨论】:

  • 通过此链接可能会有所帮助stackoverflow.com/questions/24056205/…
  • 您的解决方案有效,但仅在模拟器上有效,当我在 iPhone 上使用应用程序时,如果我使用 iPhone 的 safari,流媒体视频会冻结,流工作正常,为什么它只在我的 iPhone 应用程序上冻结?

标签: ios multithreading swift ssh raspberry-pi2


【解决方案1】:

您打破了在主线程之外处理 UI 对象的黄金法则。永远,永远不要那样做。在后台执行工作并在主队列上更新您的 UI。 UI/视图控制器/情节提要的东西不是线程安全的。

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

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 2012-04-24
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多