2017-02-05 5 views
0

firebase(〜3000人の子供と〜1.5 MB)から多くのデータを読まなければなりません。ユーザーにダウンロードしたものを表示できると良いでしょう。だから私はchild_addedを使ってそれぞれを表示することにしましたが、私が期待している通りに動作しません。firebase child_addedは本当にどのように機能しますか?

いくつかの実験の後、最初の子が追加されてから約5秒、最後に数秒(約3秒)かかることがわかりました。 valueイベントを使用すると、それらをすべて取得するのに約5秒かかります。

私の質問はfirebase child_addedが実際にどのように機能するのですか?それだけでそれらをロードし、それぞれのイベントをトリガーするか、何かが恋しくなるのですか?

更新

これは私のデータベース構造です。 ( 'child_added')上の

- contacts 
    - nw7VoNBw0iLUkb 
    - city 
    - company 
    - email 
    - name 
    - gender 
    - BEu8Yd7ihgxbaF 
    ... 

と私のコードの一部

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('child_added', snapshot => { 
    console.log('add', Date.now()) 
}) 

console.log('start', Date.now()) 
firebase.database().ref('/contacts').on('value').then(snapshot => { 
    console.log('end', Date.now()) 
}) 
+0

各ノードへのアクセスには時間がかかります。子供からデータの子供をダウンロードすると、それをダウンロードするよりもかなりの時間がかかります – ThunderStruct

+0

私は同意しますが、最初の負荷はどうですか?私はそれがすべてのものをロードするよりも速くなければならないと思いますか? –

+0

これは、ノードの深さの詳細です。最初に取得した子がより深くネストされている場合は、時間がかかります。私はあなたの質問にデータベース構造を追加することをお勧めします。人々はあなたのようにあなたを助けることができます:-) – ThunderStruct

答えて

1

すべてのデータがロードされたときに、仕上げの概念がありません。 常にあなたがそれをオフにするまで、以前に見たことがない新しい子供が現れるのを待っています。コールバックはいつでも起動できます。おそらくローカルキャッシュからアイテムをロードし、サーバー上に表示されるアイテムが増えるのを待つだけです。

という単一のスナップショットが必要な場合は、特定のノードのデータをに一度だけ追加し、今後の変更について通知したくない場合は、once('value')を使用してください。

use the docsは、on()とonce()の違い、およびさまざまな種類のイベントについて理解しておくことをお勧めします。

+1

文書では: '一度on()を呼び出すのと同じですし、off()'を呼び出すのと同じです。したがって、負荷の速度に関してそれらの間に違いはないと思うし、問題はありません。私の質問は 'child_added'と' value'イベントについてですが、 'child_added'の最初の読み込み時間と' value'を使ってそれらのすべてを読み込むのはなぜ似ているのか不思議です。ありがとう。 –

+0

毎回同じデータをキャッシュから取得している可能性があります。たくさんのデータがあり、その一部がキャッシュされていない限り、パフォーマンスの観察は非常に意味があるとは思いません。必要なときに必要最小限のデータを要求し、SDKがパフォーマンスのために最善を尽くすようにします。 –

関連する問題