web-dev-qa-db-ja.com

Firebaseで永続性を有効にすると実際に何が起こりますか?

IOSでFirebaseの永続性をオンにすると、オブザーバーは実際に何が起こり、技術レベルでどのように動作しますか?

これに基づいて、高レベルでどのように機能するかについては良い考えがあります https://firebase.google.com/docs/database/ios/offline-capabilities -Firebaseは基本的にキャッシュされたコピーを保持しますオフラインでアクセスできるデータの一部。

私が理解していないのは、オブザーバーが何回発砲し、どのような情報を使用するべきかということです。

  • Firebaseは常に、キャッシュされたデータを最初に(または、データがない場合はnull)、次にサーバーデータを使用して、オブザーバーを1回トリガーしますか?.
  • または、キャッシュされたデータが存在する場合にのみ送信し、その後にサーバーデータを送信しますか。
  • 永続モードでのobserverSingleValueと継続的なオブザーバーの動作に違いはありますか?

永続性が有効になっているアプリで、次のことに気づきました。

  • サーバーデータを送信するだけのFirebase
  • キャッシュされたデータが存在する場合、Firebaseはサーバーデータを送信します。
  • Firebaseはキャッシュされたデータを送信し、存在しない場合はnullを送信し、その後にサーバーデータを送信します。

これをクリアして、どちらが正常な動作であるかがわかるようにするとよいでしょう:)

16
James Campbell

実はとても簡単です。オブザーバーをアタッチすると(observeEventTypeまたはobserveSingleEventOfTypeのどちらを使用する場合でも)、Firebaseは次のことを行います。

  1. completeキャッシュされたデータを使用してイベントをすぐに発生させます。
  2. サーバーに更新されたデータを要求し、データが到着したときに、データがキャッシュされたものと異なる場合は新しいイベントを発生させます。

ただし、これに該当する微妙な点がいくつかあります。

  • completeの場合にのみ、キャッシュされたデータでイベントを発生させます。これの意味は:
    • キャッシュされたデータがない場合(以前にこの場所を観察したことがない場合)、not nullまたは同様のイベントを発生させます。サーバーからデータを取得するまで、イベントは発生しません。
    • この場所のpartialデータがある場合(たとえば、以前は/ foo/barを監視していましたが、現在は/ fooを監視しています)、完全な子のChildAddedイベントを取得します(例/ foo/bar)ですが、監視している場所の完全なデータをサーバーから取得するまで、Valueイベント(たとえば/ foo)は取得されません。
  • observeSingleEventOfTypeを使用している場合は、明示的に1つのイベントのみを要求しているため、データをキャッシュしている場合は、#1は発生しますが、#2は発生しません。これは、希望どおりではない可能性があります。最新のサーバーデータは表示されません)。

お役に立てれば!

16