【问题标题】:Persistent Threads in Swift GCDSwift GCD 中的持久线程
【发布时间】:2015-08-04 14:19:47
【问题描述】:

我对 Swift GCD 完全陌生。有人能解释一下 GCD 中后台线程的想法吗? 我想使用后台线程(永远不应该被杀死)连续获取传感器数据并在主线程中运行 UI 和其他东西(假设应用程序在前台运行)。目前,我尝试过这样的事情(在 AppDelegate.swift 的“应用程序”功能中):

dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_BACKGROUND.value), 0)) {

        dispatch_async(dispatch_get_main_queue()) {
            SensorCollection.sensorActivate(CMMotionManager())
        }
}

SensorCollection :我创建的传感器集合类。 sensorActivate :一个类函数。 CMMotionManager() : 内置的快速运动管理器。

【问题讨论】:

  • 您遇到了什么问题?上面的代码说要在后台启动一个任务,以便在主线程上启动对sensorActivate()的调用。这似乎与您提出的问题没有任何关系。您是否开始阅读介绍所有这些的并发编程指南? developer.apple.com/library/mac/documentation/General/…
  • 与@RobNapier 的评论分开,可能还值得一提的是,如果您想创建并拥有一个线程,那么您应该通过NSThread 来完成。不要只从 GCD 线程池中取出一个线程。只有一小部分。
  • “有人能解释一下 GCD 中后台线程的想法吗”apeth.com/iOSBook/ch38.html
  • @Tommy iOS 开发人员永远不应该使用NSThread(我想说“几乎永远不会”,但我想不出今天它是正确工具的单一案例)。你是对的,你不应该尝试“使用 GCD 线程”或类似的东西。您必须以不同的方式考虑问题,让 GCD 自己管理线程。
  • @RobNapier 绝对;对我的评论的正确编辑是将“如果你想要”切换为“如果你需要”并添加警告:你不需要。

标签: ios iphone multithreading swift grand-central-dispatch


【解决方案1】:

我想使用后台线程持续获取传感器数据

这就是内置 CMMotionManager 调用都允许您做的事情,所以只需使用它们并停止尝试自己管理线程。

例如,startGyroUpdatesToQueue:withHandler: 允许您指定队列。 startMagnetometerUpdatesToQueue:withHandler: 允许您指定队列。以此类推。

因此,只需创建一个队列,将其存储在一个属性中,并在您开始更新时指定该队列。问题解决了。当您不知道自己在做什么时,不要通过添加自己的线程来使事情变得更复杂。

【讨论】:

  • 谢谢。我会照你说的做的。老实说,我对 Swift 了解不多。我只是在尝试一些东西来学习这种语言的概念。
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多