我使用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可以分页吗?或者我必须使用一些不同的机制,有人能告诉我这个场景吗?

最佳答案

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

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//或任何增加半径的数字
因为已经设置了输入的观察者,所以它将返回新的结果。只需将它们添加到列表中并更新表/集合视图

关于ios - 我可以在GeoFire查询上应用分页以减少加载时间吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45912772/

10-09 01:33