2016-05-17 12 views
14

iOSでFirebaseの永続性を有効にすると、実際に自分のオブザーバーに何が起こり、技術レベルでどのように動作しますか?Firebaseで永続性が有効になっていると実際に何が起こりますか?

これは、これに基づいてどのように高いレベルで動作するかを知っています。https://www.firebase.com/docs/ios/guide/offline-capabilities.html - Firebaseは基本的にオフラインでアクセスできるデータのキャッシュされたコピーを保持します。

私が理解していないことは、オブザーバーが何回発射すべきか、どんな情報であるかです。

  • firebaseは、キャッシュされたデータを最初に1回だけ(またはデータがない場合はnull)、サーバーデータの後に常に1回オブザーバをトリガしますか?
  • キャッシュされたデータが存在する場合は、キャッシュされたデータのみが送信され、その後にサーバーデータが送信されます。
  • persistenceモードでobserverSingleValueと連続観察者の動作に違いはありますか?有効な永続性を持つ我々のアプリで

、私は気づいた:

  • Firebaseはちょうどそれが、サーバのデータが存在する場合は、キャッシュされたデータを送信する
  • Firebaseをサーバのデータを送信します。
  • キャッシュされたデータを送信するFirebaseと、それが存在しない場合はnullを続けてサーバデータを送信します。

とても私たちは通常の動作であるべき知ってこれをクリアするとよいでしょう:)

答えて

14

それは実際にはかなり簡単です。 (observeEventTypeまたはobserveSingleEventOfTypeを使用しているかどうか)あなたはオブザーバを接続すると、Firebaseはします:

  1. は直ちに完全キャッシュされたデータとイベントを発生させます。
  2. サーバーから更新されたデータを要求し、到着した時点で、キャッシュされたデータと異なる場合は新しいイベントを発生させます。

このかかわらから落ちるカップルの微妙な点があります。

  • それは完全であれば我々は唯一のキャッシュされたデータとイベントを発生させるでしょう。これが意味:
    • を私たちは(あなたが前にこの場所を確認されていません)は、キャッシュされたデータを持っていない場合は、私たちがnullまたは類似したとない昇給イベントになります。サーバーからデータを取得するまで、イベントは発生しません。
    • あなたはこの場所の部分データを持っている場合(例えば、あなたが以前に/ fooの/バーを観察したが、今あなたが/ fooのを観察している)、あなたは(例えば/ fooの/バー)完全な子供のためのChildAddedイベントを取得しますが、あなたあなたが観測している場所のサーバーから完全なデータを取得するまで、Valueイベント(たとえば/ foo)を取得しません。
  • あなたがobserveSingleEventOfTypeを使用している場合は、明示的にのみ、単一のイベントのために求めているとあなたがキャッシュされたデータを持っている場合ので、#1はあなたが望むものではない可能性がある、#2ませんが起こるのだろう(あなたは最新のサーバーデータは表示されません)。

+0

ありがとうございましたMicheal、私は以前には見られなかったとしても、キャッシュされたデータとしてnullを取得する状況に気付きました。だから私はこれをバグとして報告します:)。 –

+1

はい、それはバグかもしれないように聞こえます。あなたが行動を再現する方法を私たちに提供できれば、それはすばらしいことでしょう。私が言及したことを忘れてしまったことの1つは、キャッシュされたデータは、以前にサーバーから受信したデータか、ローカルに書き込んだデータのいずれかから取得できることです。そのため、コード内で(null)を設定すると、サーバーからデータを取得したことがない場合でも、その場所にヌルキャッシュされます。 –

+9

'observeSingleEventOfType'でサーバーから最新のデータを取得するにはどうしたらいいですか?私はpersistenceEnabledを持っていて、一度最新のデータを取得したいだけですが、キャッシュされたデータを使用していない場合は – swalkner

関連する問題