新しい子が 5 秒ごとに Firebase に追加されるアプリケーションがあります。私には何千人もの子供がいます。
アプリケーションのロード時に、最初の数千を、5 秒ごとにトリクルする後続の子とは異なる方法で処理したいと考えています。
値を使用し、すべてを処理してから、children_added を使用することをお勧めします。しかし、処理に時間がかかりすぎると、ポイントを逃す可能性があると思います。
ポイントを逃さないことを保証するFirebaseでこれを行う方法はありますか?
新しい子が 5 秒ごとに Firebase に追加されるアプリケーションがあります。私には何千人もの子供がいます。
アプリケーションのロード時に、最初の数千を、5 秒ごとにトリクルする後続の子とは異なる方法で処理したいと考えています。
値を使用し、すべてを処理してから、children_added を使用することをお勧めします。しかし、処理に時間がかかりすぎると、ポイントを逃す可能性があると思います。
ポイントを逃さないことを保証するFirebaseでこれを行う方法はありますか?
child_added
初期のプリロードされたデータのイベントは、イベントが親で発生する前に発生するため、イベントを一種の「初期データがロードされた」通知として使用できます。これは、別の同様の StackOverflow questionから少し変更したコードです。value
value
var initialDataLoaded = false;
var ref = new Firebase('https://<your-Firebase>.firebaseio.com');
ref.on('child_added', function(snapshot) {
if (initialDataLoaded) {
var msg = snapshot.val().msg;
// do something here
} else {
// we are ignoring this child since it is pre-existing data
}
});
ref.once('value', function(snapshot) {
initialDataLoaded = true;
});
ありがたいことに、Firebase はこのデータをスマートにキャッシュします。つまり、child_added
とvalue
リスナーの両方を作成しても、データは 1 回だけダウンロードされます。すでにネットワークを通過したデータに新しい Firebase リスナーを追加するのは非常に安価であり、そのようなことを定期的に行うのは快適だと感じるはずです。
実際には必要ないときにすべての初期データをダウンロードすることを心配している場合は、コメントにある @FrankvanPuffelen の提案に従って、タイムスタンプ付きのクエリを使用します。これは非常にうまく機能し、Firebase クエリを使用して最適化されています。
この問題には 2 つの解決策が考えられますが、どちらも満たされていません。
1) 子にタイムスタンプを付け、タイムスタンプが「現在」の値より大きい子のみを要求します。アプリケーションの「現在」と「現在」の間でデータを Firebase または「現在」の Firebase サーバー値にプッシュしている「現在」との間で同期の問題が発生する可能性があるため、これは良くありません。
2) 使用値と子が追加されました。value ですでに見られた child_added で見られる重複は破棄される可能性があります。これは、すべての履歴データを 2 回ダウンロードする必要があるため、大規模なデータ セットには使用できません。
すべてを提供しない「child_added」のようなコマンドが存在しないのはなぜですか?