2012-08-16 6 views
14

私はFirebaseを使用して、同じデータを受け取り、2つの異なる方法で(リストやGoogleマップ上のマーカーとして)表示します。Firebase - キャッシュはパフォーマンスを改善しますか?

現時点では、各ビュー(マップまたはリスト)にfirebaseのデータを照会し、それらをまとめてマージして表示するコードがあります。代わりに、私はこの計画を検討しています。スタートアップ時に、データを照会し、マージし、ビューからビューに渡す配列にすべて保存します。

ある意味では、私はfirebaseデータを配列にキャッシングしています。これはある意味では理想的ではありません.Firebaseに直接照会するほどキャッシュされたデータは最新ではありません。一方、私はFirebaseを一度呼びます。

これはパフォーマンスに影響しますか? Firebaseからのデータの読み込みは、配列からデータを読み込むのと同じオーダーの時間内に行われますか?

答えて

21

通常、Firebaseの使用を制限するためのデータのキャッシュは不要です。 Firebaseは、クライアント上に「アクティブな」データの独自のキャッシュを保持します。 「アクティブ」は、「オン」コールが未処理のデータとして定義されます。したがって、アクティブなデータの場合、追加の「オン」コールまたは「ワンタイム」コールは、データがすでにロードされているため、ネットワークトラフィックを必要としません。

"firebaseを照会する"とは何を意味するのかよくわかりません。 Firebaseは伝統的な意味でクエリを持っていません。コールバックを付加するためのメソッドがあります。 Firebaseから定期的にデータを取得するために "once()"関数を使用していますか?もしそうなら、これは潜在的に非常に非効率的である可能性があります。一度は便利な方法であり、一般的にはアクセス頻度が極端に低いデータや何らかの理由でリアルタイムに更新したくないデータに対してのみ使用する必要があります。 once()が完了したときにアクティブな "on"コールが未処理の場合、Firebaseはそのデータのキャッシュをフラッシュし、その後のonce()コールはサーバへのラウンドトリップを必要とします。

何がしたいことは、同期効率的な方法でデータの最新バージョンのローカルコピーにアクセスする方法であれば、私はこの方法をお勧めします:、()の呼び出しで1つのを維持することで

var savedSnapshot = null; 
dataRef.on("value", function(snapshot) { 
    savedSnapshot = snapshot; 
}); 

//and then when you need to read the data 
var theData = savedSnapshot.val() 

をFirebaseは、必要なときにすべてのデータをリロードするのではなく、変更があったときにワイヤを介してデルタを送信するだけで、データを最新の状態に保つことができます。

+1

大きな説明。ドキュメントは、この印象を与えるが、そのような詳細には入り込まない(これはドキュメントの大きな付録であるかもしれない)。 – Kato

+1

私たちは近い将来、ドキュメントにいくつかのセクションを掲載する予定です。 –

+0

@AndrewLeeは、このパフォーマンスセクションはこれまでに書かれますか?私はFirebaseを2年間使用していましたが、後で使用するためにdatasnapshotを保存する方法について、この(5歳の)回答が説明されたときとまったく同様に「クリック」しませんでした。私は、Firebaseが何をしているのか知りたくないという恐怖のために、防御的に多くのコーディングを行っていたことを認識しました。 DataSnapshotは、内部の不変なデータ構造へのナビゲート可能なカーソルであり、 'val()'はそのデータをPOJOにクローンすることがわかりました。これはとてもエレガントにデザインされています!脱帽 :-) – skrebbel