32

私のアプリは Firebase を使用してデータを同期および復元します。このメソッドを使用して、setValue:withCompletionBlock:Firebase オブジェクトを挿入、更新、および削除します。このメソッドは、CoreData の保存があるたびに呼び出されるため、すべてのローカル変更が Firebase に同期されます

- (void) setValue:(id)value withCompletionBlock:(void (^)(NSError* error, Firebase* ref))block;

同期するとすべてのローカル データが Firebase にアップロードされ、復元するとローカル データが Firebase データに置き換えられます。

- (void) observeSingleEventOfType:(FEventType)eventType withBlock:(void (^)(FDataSnapshot* snapshot))block;

を観察FEventTypeValueして使用FDataSnapshotし、Firebase からデータを取得してローカル データを復元します。

persistenceそのため、Firebaseに設定するまで、すべてが完璧に機能します。

[Firebase setOption:@"persistence" to:@YES];

がオンの場合persistence、更新すると、オブジェクトを Firebase に挿入してから復元すると、挿入前のデータが復元されます。つまり、新しく挿入されたオブジェクトは復元されません。ただし、再度復元すると、挿入されたオブジェクトが復元されます。オブジェクトが削除された場合も同じことが起こります。削除されたオブジェクトは、最初に復元すると再び表示され、再度復元すると消えます。Firebase データ ビューで、Firebase オブジェクトが正しく挿入または削除されていることがわかります。

ここで何が間違っているのかわかりません。復元するときだけ問題があります。Firebase キャッシュがこの復元の問題を引き起こしていると思います。復元する前に、Firebase キャッシュをクリアすることを考えています。私の質問は

  1. 復元前にキャッシュをクリアすることは良い方法ですか?
  2. はいの場合、Firebase キャッシュをクリアする方法は?
  3. いいえの場合、データを復元するための最良の方法を教えていただけますか。
4

2 に答える 2

26

[注: Realtime Database の代わりに Cloud Firestore を使用するオプションがある場合は、オフライン サポートがはるかに優れています。.get() を実行すると、自動的にサーバーから最新のデータを取得しようとし、オフラインの場合はキャッシュされたデータのみを使用します。サーバーまたはキャッシュからデータを取得するように具体的に要求することもできます。]

残念ながら、これは予期された動作です。おそらくobserveSingleEventOfTypeの代わりにobserveEventOfTypeを使用することで回避できます

基本的に、データを観察するときはいつでも、最初に永続キャッシュからデータを取得します。そのデータは、Firebase から最後に受け取ったデータになります。observeEventOfType の代わりにobserveSingleEventOfType を使用しているため、Firebase から定期的な更新を受け取ることはなく、キャッシュされたデータには実際に書き込まれた最新のデータは含まれません。

簡単な修正として、問題のデータにobserveEventOfTypeを追加するだけでよい場合があります。イベントに対して実際に何もする必要はありません。しかし、それらを常に聞いていると、アプリは firebase から最新のデータを取得し、observeSingleEventOfType を呼び出すと、最新のデータがキャッシュされていることを確信できます。

于 2014-07-01T18:23:54.637 に答える