如何在 GeoFire 中正确使用存储的搜索半径?

How do I properly use a stored search radius with GeoFire?

我正在使用 GeoFire 搜索给定的半径,用户可以在我的应用程序中设置该半径并将其存储在 FireBase 上。当页面加载时,在 运行 查询 GeoFire 之前,我从 Firebase 获取半径。但是,当我 运行 下面的代码时,出现以下错误:Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Precision must be less than 23!'

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

我的问题是,我是否因为我的 searchRadius 为 0 而收到此错误,如果是这样,我如何确保在我的 GeoFire 查询之前抓取用户搜索半径 运行s 的 FireBase 块?

    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