Подтвердить что ты не робот

Настойчивость Firebase, ясный кеш Firebase

Мое приложение использует 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 до того, как я восстановлен. Мой вопрос:

  • Очищает кеш до восстановления хорошего метода?
  • Если да, как очистить кеш Firebase?
  • Если нет, можете ли вы предложить мне лучший способ восстановления данных.
4b9b3361

Ответ 1

[ПРИМЕЧАНИЕ: Если вам удобнее использовать Cloud Firestore вместо Realtime Database, у него гораздо лучшая автономная поддержка. Когда вы выполняете .get(), он автоматически пытается извлечь последние данные с сервера и использовать кэшированные данные только в автономном режиме. Вы также можете специально запросить получение данных с сервера или из кэша.]

Это, к сожалению, ожидаемое поведение. Вы, вероятно, можете обойти это, используя наблюдающийEventOfType вместо наблюдающегоSingleEventOfType

По сути, всякий раз, когда вы наблюдаете данные, мы собираемся сначала извлечь данные из нашего постоянного кэша. Эти данные будут теми данными, которые мы в последний раз получили от Firebase. Поскольку вы используете наблюдающийSingleEventOfType вместо наблюдающего_вентOfType, вы не будете получать регулярные обновления от Firebase, и поэтому данные, которые мы кэшировали, фактически не будут включать в себя последние данные, которые вы написали.

В качестве простого исправления вы можете просто добавить наблюдающийEventOfType к рассматриваемым данным. Вам на самом деле не нужно ничего делать с событиями. Но если вы будете слушать их постоянно, то ваше приложение будет получать последние данные из firebase, а когда вы вызываете наблюдатьSingleEventOfType, вы можете быть уверены, что в нем будут храниться последние данные.

Ответ 2

Вы можете использовать флаг snap.metadata.fromCache чтобы проверить, snap.metadata.fromCache ли значение из кэша или нет. Обратите внимание, что если значение кэша и значение с сервера совпадают, он не будет запускать ваш onSnapshot дважды, если вы не добавите флаг includeMetadataChanges показанный ниже, вместо этого он будет includeMetadataChanges только один раз, а для metadata.fromCache будет установлено значение true.

db.collection('users').doc(uid).onSnapshot({ includeMetadataChanges: true }, (snap) => {
   if (!snap.metadata.fromCache) {
        const user = snap.data();
        // Code here
    }
})