我可以在GeoFire Query上应用分页以减少加载时间

时间:2017-08-28 06:19:23

标签: ios swift firebase geofire

我使用GeoFire从Firebase数据库中获取基于位置的数据。我知道如果我在查询中设置较少的半径,那么我可以快速加载数据,但我的要求是我想要基于位置的短数据,因此最近的记录首先显示,依此类推。所以我已经通过总地球半径的GeoFire查询中的当前位置,因为我想要所有数据。但我不知道如何对GeoFire进行分页,因此将来Firebase数据库中有更多记录时,我当前的实现肯定会花费更多时间来加载。

以下是我用于获取基于位置的记录的代码剪辑。

        let eartchRadiusInKms = 6371.0
        let geoFire = GeoFire(firebaseRef: databaseRef.child("items_location"))

        let center = CLLocation(latitude: (self.location?.coordinate.latitude)!, longitude: (self.location?.coordinate.longitude)!)
        let circleQuery = geoFire?.query(at: center, withRadius: eartchRadiusInKms)

        if CLLocationCoordinate2DIsValid(center.coordinate) {
            circleQuery?.observeReady({

                let myPostHandle : DatabaseHandle = circleQuery?.observe(.keyEntered, with: { (key: String?, location: CLLocation?) in

                    // Load the item for the key
                    let itemsRef = self.databaseRef.child("items").child(key!)
                    itemsRef.observeSingleEvent(of: .value, with: { (snapshot) in
                        // Manage Items data
                    })
                })
            })

        }

GeoFire可以实现分页吗?或者我必须使用一些不同的机制,任何人都可以在这种情况下告诉我吗?

1 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,我实际上首先加载了一个小半径,然后增加了半径并在后台服务中加载了另一块数据。在完成调用后,我使用

在集合视图中重新加载了我的数据
collectionView.reloadData()`

以下是您在geofire中查询的方式

self.circleQuery = self.geoFire?.query(at: myLocation, withRadius: myRadius)

self.circleQuery?.observe(.keyEntered, with: { (key: String?, location: CLLocation?) in ....

在geofire文档中查看此功能。它会在后台跟踪新输入的位置。现在你想要分页考虑一个tableView的例子,你可以在onScroll上调用它

myRadius = myRadius + 1000 //或任何增加半径的数字

由于keyEntered观察者已设置,因此它将返回新结果。只需将它们添加到列表中并更新表/集合视图

即可