0

私は GeoFire を使用して、ユーザーがアプリで設定して FireBase に保存できる特定の半径を検索しています。ページが読み込まれると、GeoFire クエリを実行する前に、Firebase から半径を取得しています。ただし、以下のコードを実行すると、次のエラーが表示されます: Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Precision must be less than 23!'

戦略的に配置されたいくつかの print ステートメントをいじってみると、GeoFire クエリが実行されるまでに searchRadius が 0 として返されているように見え、非同期読み込みが行われているのではないかと思いました。

私の質問は、searchRadius が 0 であるためにこのエラーが発生しているのかということです。その場合、ユーザーの検索半径を取得する FireBase ブロックが GeoFire クエリの前に実行されるようにするにはどうすればよいですか?

    self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeEventType(.Value, withBlock: { snapshot in
        self.searchRadius = snapshot.value as! Double
    })

    let center = CLLocation(latitude: 37.331469, longitude: -122.029825)
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius)



    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in

        //Do code for each result returned

    }) //End GeoFire query
4

1 に答える 1

0

はい、これは非同期読み込みの問題です。Firebase がすでにsearchRadiusvalue コールバックの値をキャッシュしている場合でも、インラインで実行されることはありません。スレッドは、値が更新される前に GeoFire クエリのセットアップに進みます。

このコード スニペットに基づいて、クエリ コードをコールバック内に移動することにより、クエリを実行する前に半径が設定されていることを確認できます。の値が変更された場合にクエリが再度実行されないように、単一のイベントを監視することもできますsearchRadius

self.ref.childByAppendingPath("users/\(self.ref.authData.uid)/searchRadius").observeSingleEventOfType(.Value, withBlock: { snapshot in
    self.searchRadius = snapshot.value as! Double
    let center = CLLocation(latitude: 37.331469, longitude: -122.029825)
    let circleQuery = geoFire.queryAtLocation(center, withRadius: self.searchRadius)
    circleQuery.observeEventType(GFEventTypeKeyEntered, withBlock: { (key: String!, location: CLLocation!) in
        //Do code for each result returned
    }) //End GeoFire query
}) // End observeSingleEventOfType
于 2016-07-30T04:23:54.163 に答える