【问题标题】:Cannot stop Updates with stopUpdatingLocation and stopRelativeAltitudeUpdates无法使用 stopUpdatingLocation 和 stopRelativeAltitudeUpdates 停止更新
【发布时间】:2020-11-03 13:46:52
【问题描述】:

我正在为 watchOS 构建一个滑翔伞应用程序,它可以显示和记录高度、速度、滑翔比等值。

到目前为止,我构建了 UI,集成了一些设置,并且正在接收压力传感器数据和 gps 位置。 为了节省电池寿命,我添加了一个“停止按钮”来触发 locationManager.stopUpdatingLocation 和 CMAltmeter.stopRelativeAltitudeUpdates 函数。但在控制台中,我仍然可以看到位置和高度更新。

我将代码上传到 https://github.com/LukeCrouch/iAlti/tree/main/iAlti%20WatchKit%20Extension 。 有趣的文件大概是ControlsView,这里我声明并调用了相关函数。

    func stopLocation() {
        self.locationManager.stopUpdatingLocation()
    }

感谢我能得到的每一点帮助,这是我第一次编写应用程序! :)

卢克干杯

【问题讨论】:

  • 提供项目是个好主意,但没有人真的想点击某个链接并查看所有代码。您的工作是将代码减少到所需的内容,以便理解和重现问题并在此处显示。
  • @matt 我明白你的意思,我会编辑我的问题!

标签: xcode swiftui core-location apple-watch core-motion


【解决方案1】:

问题出在这一行:

@ObservedObject var locationManager = LocationManager()

每次重新生成 ControlsView 时,该行都会重新运行。所以 LocationManager 是一个不同的 LocationManager。因此,您是在告诉 LocationManager 的 CLLocationManager 停止更新,但这与开始的 CLLocationManager 不同。

相反,将其设为单例环境对象,以便您的应用只有 一个 LocationManager 和 一个 CLLocationManager。这样一来,每次与它交谈时,您都在与同一个人交谈。

【讨论】:

  • 感谢您的回复!我昨晚用一个单身人士测试了它,它确实有效!在研究单例时,我还发现几篇文章说应该不惜一切代价避免使用它们。您对此有何看法?
  • 我并不是说要使用带有大写 S 的 Singleton 设计模式。我是说即使您的视图被重新创建了很多次,也必须只有一个 LocationManager。 SwiftUI 为您提供属性包装器类型以确保这一点。这就是为什么我说“环境对象”。您可以在此处使用实际的@EnvironmentObject,或者如果唯一的 LocationManager 在此视图中,您也可以使用@StateObject
  • 因此,只需将代码中的 @ObservedObject 更改为 @StateObject 就足够了。但这正是一个单例(小 s)。只是让这个对象保持活力是在幕后为您完成的。
  • 我学到了关于 StateObejct & ObservedObject 的精彩基础讨论。
猜你喜欢
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
相关资源
最近更新 更多