gpt4 book ai didi

ios - 如何通过 GeoFire 正确使用存储的搜索半径?

转载 作者:行者123 更新时间:2023-11-30 13:11:32 27 4
gpt4 key购买 nike

我正在使用 GeoFire 搜索给定半径,用户可以在我的应用中设置该半径并将其存储在 FireBase 上。页面加载时,在运行 GeoFire 查询之前,我将从 Firebase 获取半径。但是,当我运行下面的代码时,出现以下错误:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“精度必须小于 23!”

通过使用一些策略性放置的打印语句,看起来在 GeoFire 查询运行时 searchRadius 返回为 0,这让我怀疑异步加载正在发挥作用。

我的问题是,由于我的 searchRadius 为 0,我是否会收到此错误?如果是,我如何确保获取用户搜索半径的 FireBase block 在我的 GeoFire 查询之前运行?

    self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeEventType(.Value, withBlock: { snapshot in
self.searchRadius = snapshot.value as! Double
})

let center = CLLocation(latitude: 37.331469, longitude: -122.029825)
let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius)



circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in

//Do code for each result returned

}) //End GeoFire query

最佳答案

是的,这是一个异步加载问题。即使 Firebase 已经缓存了 searchRadius 的值,该值回调也不会内联执行。该线程将在值更新之前继续设置 GeoFire 查询。

基于此代码片段,您可以通过将查询代码移动到回调内部来确保在运行查询之前设置半径。您可能还想观察单个事件,以便在 searchRadius 的值发生更改时不会再次运行查询。

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeSingleEventOfType(.Value, withBlock: { snapshot in
self.searchRadius = snapshot.value as! Double
let center = CLLocation(latitude: 37.331469, longitude: -122.029825)
let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius)
circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in
//Do code for each result returned
}) //End GeoFire query
}) // End observeSingleEventOfType

关于ios - 如何通过 GeoFire 正确使用存储的搜索半径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38670138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com