【问题标题】:How to copy user location only once from location manager?如何从位置管理器只复制一次用户位置?
【发布时间】:2021-01-20 23:24:04
【问题描述】:

我在位置管理器类中有一个函数,可以获取用户的当前位置坐标。对于我在另一个视图中的使用,它更新得太频繁了。我正在尝试想出一种方法来减少获取位置的频率或次数有限,但无法想出任何东西。我的猜测是它需要时间戳或我不熟悉的方法。非常感谢任何帮助。

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let location = locations.last else { return }

    // self.location = location does the copying here too frequently
    self.location = location
    
    self.reverseGeocode()
}

解决方案:

经过多次试验和错误,最终解决方案是 Observable Object 属性包装器和 State Object 属性包装器之间的区别。我的问题是 Observable Object 属性包装器允许我在视图中使用的变量不断变化,这在我的特定情况下不是我想要的。一旦我将其更改为状态对象,它就会完全按照我的意愿执行,即在位置更改时更新一次。

对于那些感兴趣的人,这里有一篇很好的博客文章,概述了这些主要区别: https://www.donnywals.com/whats-the-difference-between-stateobject-and-observedobject/.

【问题讨论】:

    标签: ios swift swiftui core-location


    【解决方案1】:

    如果目标是了解我们的位置一次,则根本不要开始更新位置。相反,只需致电requestLocation。这将为您提供单个更新(在可能的延迟之后)。

    【讨论】:

      【解决方案2】:

      你可以试试Publishers。下面是一个使用节流阀的未经测试的示例。

      油门文档:

      发布上游发布者在指定时间间隔内发布的最新或第一个元素。

      // Setup:
      let locationPublisher = PassthroughSubject<CGFloat, Never>()
      
      // Send updates.
      locationPublisher.send(value)
      
      // Update only every x seconds.
      struct MyView {
          @State var location: CGFloat? = nil
          var body: some View {
              Text("Value: \(location)")
              .onReceive(
                  locationPublisher
                  .throttle(for: 1.0, scheduler: RunLoop.main, latest: true) {
              ){
                  self.location = $0
              }
          }
      }
      

      要获得第一次更新,还有一种方法是.first()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-01
        • 2013-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多