2017-06-17 6 views
1

Firebaseのユースケースは、ほとんどの場合とは少し異なります。バックエンドにはFBを排他的に使用しません。我々は、関係とすべてのデータを扱う大きなMariaDBサーバを持っています。Firebaseデータベース - iOSでJSONを繰り返しダウンロードしないようにしてください

私たちFBの目標は、iOSデバイスのクライアントが特定のデータを利用できるようにすることです。データを一度ロードしてから、この特定のデータの変更をリッスンする必要があります。ここではそれがどのように動作するかの大まかな概要です:初期化されているメインのViewControllerが

  • Firebaseをロードされている

    1. は、我々はFIRDataEventTypeChildAddedを聞きます。 (持続性が有効)
    2. Firebaseはすべての一致するレコードをロードします。その後、ループバックしてローカルのSQLite DBに格納します。

    通常のユーザーフローでは、他のViewControllerを画面上に押します。問題は、一度メインのViewControllerがロードされると、FIRDataEventTypeChildAddedは各レコードに対して再度発生します。

    質問:

    1. FIRDataEventTypeChildAdded火災が再び、それはその内部キャッシュからデータをロードするか、それFirebaseサーバーから再ダウンロードするすべてのものです(永続?)?私はネットワークリンクコンディショナーを使ってインターネット接続を完全に切断しましたが、そうするとFIRDataEventTypeChildAddedは発生しませんが、ネットが戻ったらすぐにすべてのレコードに対してFIRDataEventTypeChildAddedが発生します。
    2. ログイン時にすべてのレコードをロードし、そのレコードの変更のみをリッスンする場合は、どのようにすればよいでしょうか?私はすでにorderByとstartingAtを使用していますので、上記のいずれかが含まれている場合、別の "hasDownloaded = yes"フィルタを追加することはできません。

    ありがとうございます。

  • +0

    テストしているコードを共有してください。それがなければ、具体的なことを言うのは難しいです。 [MCVEの作成](http://stackoverflow.com/help/mcve)も参照してください。 –

    +0

    この場合、コードは重要ではありません。問題は、Firebaseが背後でどのように動作するかについての明確な定義がないことです。 簡潔にするために、私はメインのViewControllerにChildAddedとChildChangedリスナーを持っています: VCがロードされるたびにJSONがサーバからダウンロードされるかどうかを理解する上で私の質問を読んでください。それがローカルキャッシュからフェッチされてもChildAddedリスナを起動する場合 – Adam

    +0

    viewControllerとFirebaseがどのようにコード内に実装されているかを見ることなく、ユースケースが何であるかは不明です。つまり、VCがロードされるたびに* VC内のコードに大きく依存する。 .childAddedイベントは、各子に対して1つ、追加された追加の子に対して1つずつ発生させるよう意図的に設計されています。再接続後に追加された新しい子の場合は起動しますが、実装にも依存します。 – Jay

    答えて

    0

    Firebaseリファレンスリスナーはサーバーに一度接続し、そのクエリがオフになるまで接続を維持します。リッスンされる参照がメモリ内にある限り、データベースへの接続は1つだけです。この接続が行われると、子がデータを再び追加すると、すべてのデータが返されます。

    ここでの問題点は、Firebaseではそれほどではありませんが、アプリケーションがリスナーを参照しながら読み込み、毎回ネットワークからデータをダウンロードできるようにしています。

    あなたの最初の質問には、はい、それはネットワークからダウンロードされています。 2番目の方法では、Firebaseクエリが決してメモリを残さないようにするだけです。これは、クエリをグローバルスコープにすることによって、またはビューコントローラがスコープを終了したときにクエリをオフにしないことで実行できます(その後のロードで複数のクエリを読み込まないようにする必要があります)。

    関連する問題