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

问题描述:

我已经使用GeoFire从我的Firebase数据库中获取基于位置的数据。我知道如果我在查询中设置的半径较小,那么我可以快速加载数据,但我的要求是我想根据位置来缩短数据,因此最近的记录首先显示,等等。所以我已经通过GeoFire查询当前位置的总地球半径,因为我需要所有的数据。但是我不知道如何应用GeoFire分页,因此在将来当Firebase数据库中有更多记录可用时,我当前的实现肯定需要更多时间才能加载。我可以在GeoFire Query上应用分页以减少加载时间吗

下面是我用来获取基于位置的记录的代码片段。

 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可以分页吗?或者我必须使用一些不同的机制,任何人都可以请这方面的建议吗?

+0

我所知分页是默认不支持GeoFire,所以你将不得不使用自己的机制。一种解决方案是在第一次呼叫时使用小半径,并在每次下一次呼叫时增加它。我没有看到任何其他干净的解决方案。我们也想在我们的项目中使用GeoFire,但由于我们的需求非常缓慢,并且使用了太多的调用,所以我们最终编写了自己的API。 – ZassX

我遇到过类似的问题,我实际上首先加载了一个小半径,然后增加了半径并在后台服务中加载了另一块数据。在电话会议结束我用

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观察者已经设置所以它会回报你回新结果。只需将它们添加到您的列表,并就更新表/集合视图

+0

你可以请分享一些代码片段,所以我可以得到更好的主意。因为按照我的想法,如果我这样做,我可能会有重复的数据,因为前10英里所记录的记录也出现在20英里之内。因为GeoFire不接受半径范围。所以当半径增加时,旧的记录也被提取,所以没有使用这种过程。 –

+1

不会重复数据,因为您不改变查询,您只需更改半径。 GeoFire已经可以处理这个问题,所以不用担心。我正在编辑我的文章并包含一些代码片段。当你想在半径增大,新位置 –

+1

@DhavalDobariya不产生新的查询,而不是把你的查询对象和它的半径设置为新的值,当从以前的半径结束(分页)数据。这将避免数据重复 –