我可以在 GeoFire 查询上应用分页以减少加载时间吗
Can I apply pagination on GeoFire Query to reduce load time
我已经使用 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
// 或任何增加半径的数字
由于已设置 keyEntered 观察器,因此它将 return 您支持新结果。只需将它们添加到您的列表并更新 table / 集合视图
我已经使用 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
// 或任何增加半径的数字
由于已设置 keyEntered 观察器,因此它将 return 您支持新结果。只需将它们添加到您的列表并更新 table / 集合视图