如何解决如何仅从位置管理器复制用户位置一次?
我在位置管理器类中有一个函数,用于获取用户的当前位置坐标。它更新太频繁,无法在另一个视图中使用。我试图想出一种方法来降低获取位置的频率或次数有限,但一直没有想出任何办法。我的猜测是它需要时间戳或我不熟悉的这种方法。非常感谢任何帮助。
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 举报,一经查实,本站将立刻删除。