2017-08-28 17 views
0

FireFoxデータベースから位置情報を取得するためにGeoFireを使用しました。クエリで半径を小さくしてデータをすばやく読み込むことができますが、私の要件は場所に基づいてデータを短くすることです。最も近いレコードが最初に表示されるなどです。だから私はすべてのデータが必要なので、地球の半径を合計したGeoFireクエリで現在の場所を渡しました。しかし、私はGeoFireでページネーションを適用する方法がないので、Firebaseデータベースでより多くのレコードを利用できるようになると、現在の実装では確実にロードに時間がかかります。GeoFireクエリでページネーションを適用して読み込み時間を短縮する

以下は、場所ベースのレコードを取得するために使用したコードです。

 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ではデフォルトではサポートされていないので、独自のメカニズムを使用する必要があります。 1つの解決方法は、最初の呼び出しで小さい半径を使用し、次の呼び出しごとに小さくすることです。私は他の清潔な解決策を見ません。私たちはプロジェクトでもGeoFireを使いたいと思っていましたが、私たちのニーズは非常に遅く、呼び出し回数が多すぎるため、独自のAPIを作成しました。 – ZassX

答えて

3

私は同様の問題に直面していましたが、実際に小さな半径を最初にロードしてから半径を増やし、バックグラウンドサービスで別のデータをロードしました。コールの完了で、私は

collectionView.reloadData()` 

を使用して、コレクションビューで自分のデータを再ロードここでgeofireのドキュメントでこの機能をチェックアウトあなたはgeofire

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

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

に問い合わせる方法です。新しい入力された場所をバックグラウンドで追跡します。今、あなたが望むようにtableViewの例を考えてページネーション、あなたはちょうどそれが新しいあなたを戻って戻りますのでkeyEnteredオブザーバがすでに設定されているとおり、半径

を高めるためにonScroll

myRadius = myRadius + 1000 //または任意の数でこれを呼び出すことができます結果。

+0

いくつかのコードスニペットを共有していただけますか。より良いアイデアを得ることができます。私がそうするなら私の思考通りに、私は最初の10マイルで言うレコードが20マイルで来たので、データが重複する可能性があるからです。 GeoFireはradiusの範囲を受け付けないためです。したがって、半径が大きくなると、古いレコードもフェッチされるので、そのようなプロセスは使用されません。 –

+1

いいえ、半径を変更するクエリを変更していないため、データを複製しません。 GeoFireはすでにそれを処理していますので、心配しないでください。私は自分の投稿を編集しており、いくつかのコードスニペットを含んでいます。 –

+1

@DhavalDobariyaは、半径を増やして新しい位置を取得したいときに新しいクエリを生成せず、以前の半径からのデータが終了したときにクエリオブジェクトを取り出し、その半径を新しい値に設定します(ページ区切り)。これはデータの重複を避けるでしょう –

関連する問題