2017-07-19 4 views
2

私はGeoFireを使用していて、いくつかの条件を満たす3つの結果しか取得しようとしていません。これは私の場合であり、観察者を止めることはありません。何千もの結果がありますが、私はそれをすべて手に入れますが、私は3だけしか必要としません。this answerに基づいていますが、わかるように私の場合はうまくいきません。 誰か助けてもらえますか?GeoFire + Swift 3は観測を停止できません

var newRefHandle: FIRDatabaseHandle? 
var gFCircleQuery: GFCircleQuery? 

func findFUsersInOnePath(location: CLLocation, 
         radius: Int, 
         indexPath: String, 
         completion: @escaping() ->()){ 
    var ids = 0 
    let geofireRef = usersRef.child(indexPath) 
    if let geoFire = GeoFire(firebaseRef: geofireRef) { 
     gFCircleQuery = geoFire.query(at: location, withRadius: Double(radius)) 
     newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in 
      // if key fit some condition 
      ids += 1 
      if (ids >= 3) { 
       self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!) 
       completion() 
      } 
     }) 

     gFCircleQuery?.observeReady({ 
      completion() 
     }) 
} 

、Optionalsに気にしないでくださいそれだけでGoeFireのドキュメントから、この例のコード

ためである(?):

を呼び出し、地理クエリのための1つまたはすべてのコールバックをキャンセルするにはremoveObserverWithFirebaseHandle:またはremoveAllObservers :,それぞれ 。

どちらも機能しません。

答えて

1

Geofire Under the HoodsがFirebaseデータベースクエリを実行します。すべての結果はFirebaseから一度に取得され、ローカルではそれぞれに対してkeyEnteredイベントが発生します(通常のSDKの場合は.childAdded)。

removeObserver(withFirebaseHandle:を呼び出すと、Geofireは追加の検索結果を取得しなくなります。しかし、それはまだ回収された結果についてはkeyEnteredを発射するでしょう。

newRefHandle = gFCircleQuery?.observe(.keyEntered, with: { (key, location) in 
    if (id <= 3) { 
     // if key fit some condition 
     ids += 1 
     if (ids >= 3) { 
      self.gFCircleQuery?.removeObserver(withFirebaseHandle: self.newRefHandle!) 
      completion() 
     } 
     } 
    }) 
+0

感謝を:

ソリューションは、これらのすでに取得結果を無視するように条件を追加することです! 1-3の結果を得るたびに、何千ものオブジェクトをダウンロードしてもらえますか? –

+1

あなたは、あなたの範囲内にあるアイテムをダウンロードするための支払いを行います。特定の数のキーを含む最小範囲が必要な場合、この方法は理想的ではありません。キーが発射される順序は、クエリの中心までの距離に基づくのではなく、クエリの範囲の1つのコーナーからのものです。小さな範囲のクエリから始めて、十分な結果が得られなかった場合は、より広い範囲で別のジオクエリを実行する方がよいでしょう。 –

+0

私は参照してください。どうもありがとうございました。 –

関連する問題