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

时间:2016-07-30 03:41:32

标签: ios swift asynchronous firebase geofire

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

从播放一些具有战略意义的打印语句开始,看起来,当GeoFire查询运行时,searchRadius返回为0,这让我怀疑异步加载正在发挥作用。

我的问题是,由于我的searchRadius为0,我收到此错误,如果是这样,我怎样才能确保在我的GeoFire查询之前运行抓取用户搜索范围的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

1 个答案:

答案 0 :(得分:0)

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

基于此代码段,您可以通过在回调中移动查询代码来确保在运行查询之前设置radius。您可能还希望观察单个事件,以便在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