当前位置: 首页 > 知识库问答 >
问题:

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

齐志勇
2023-03-14

嗨,我是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个答案

唐彦
2023-03-14

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

在您的例子中,您正试图从背景队列上的故事板加载视图/视图控制器程序集。这是你的问题。

 类似资料:
  • 我想让一些代码在后台持续运行。我不想在服务中这样做。还有其他可能的方法吗? 我曾尝试在我的活动中调用线程类,但我的活动在后台保留了一段时间,然后就停止了。线程类也停止工作。

  • 本文向大家介绍如何在C#中检查线程是否为后台线程,包括了如何在C#中检查线程是否为后台线程的使用技巧和注意事项,需要的朋友参考一下 要检查线程是否是后台线程,代码如下: 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 活动可以按以下方式访问此列表: 我的问题是,我要这样做: > 在函数中,我异步获取数据,首先检查数据库(房间)中的数据

  • 我们班的任务是制作一个实现RESTful API调用的应用程序。我的应用程序有两个屏幕: 列出所有口袋妖怪类型的第一个屏幕(以解析的JSON形式) 列出有关所选类型的详细信息(以解析的JSON形式)的第二个屏幕 在这个项目的编写过程中,我们的任务是用“后台线程”指示代码段。我不确定“后台线程”在我的代码中的位置。 我找到了这个StackOverflow答案,它表示DispatchQueue中的代码

  • 问题内容: 我必须使用Swift 3在iOS中制作一个应用程序,该应用程序在后台运行时每3或5分钟通过API发送一次用户的位置信息。我不知道哪种方法是最好的方法,或者由于苹果严格的背景规定,是否有可能这样做。该位置必须非常精确,并且该应用需要在背景下长时间运行,可能不会消耗太多电池。如果不可能,那么很高兴知道在这种情况下哪种方法最好。非常感谢你。 问题答案: 该应用程序在后台运行时每3或5分钟通过