微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何仅从位置管理器复制用户位置一次?

如何解决如何仅从位置管理器复制用户位置一次?

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

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/

解决方法

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

,

你可以试试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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。