Что на самом деле происходит, когда в Firebase включено сохранение?

При включении персистентности для Firebase в iOS, что на самом деле происходит с моими наблюдателями и как они ведут себя на техническом уровне?

У меня есть хорошая идея, как он должен работать на высоком уровне на основе этого https://www.firebase.com/docs/ios/guide/offline-capabilities.html - Firebase по существу хранит кешированную копию данные, к которым вы можете получить доступ, в автономном режиме.

Я не понимаю, сколько раз мои наблюдатели должны стрелять и с какой информацией.

  • Почему firebase всегда запускает мои наблюдатели один раз с любыми кэшированными данными сначала (или null, если нет данных), за которыми следуют данные сервера.
  • Или он отправляет только кешированные данные, если они существуют, за которыми следуют данные сервера.
  • Есть ли разница между observerSingleValue и непрерывным поведением наблюдателя в режиме сохранения?

В нашем приложении с включенным сохранением я заметил:

  • Firebase просто отправляет данные сервера
  • Firebase отправляет кешированные данные, если они существуют, а затем данные сервера.
  • Firebase отправляет кешированные данные и null, если они не существуют, за которыми следуют данные сервера.

Было бы хорошо прояснить это, чтобы мы знали, какое должно быть нормальное поведение:)

Ответы

Ответ 1

Это на самом деле довольно просто. Когда вы присоединяете наблюдателя (используя observeEventType или observeSingleEventOfType), Firebase будет:

  • Немедленно поднять события с любыми полными кэшированными данными.
  • Запросить обновленные данные с сервера и, когда они появятся, поднять новые события, если данные отличаются от того, что было кэшировано.

Есть несколько тонкостей, которые выпадают из этого, хотя:

  • Мы собираем события с кэшированными данными только в том случае, если они завершены. Это означает:
    • Если у нас нет кэшированных данных (вы не наблюдали это местоположение раньше), мы не будем создавать события с нулевым или похожим. Вы не получите никаких событий, пока не получите данные с сервера.
    • Если у вас есть частичные данные для этого местоположения (например, вы наблюдали /foo/bar ранее, но теперь вы наблюдаете /foo ), вы получите ChildAdded события для полных детей (например,/foo/bar), но вы не получит событие Value (например, для /foo ), пока мы не получим полные данные с сервера для местоположения, которое вы наблюдаете.
  • Если вы используете observeSingleEventOfType, вы явно запрашиваете только одно событие, и если у вас есть кешированные данные, будет # 1, но # 2 не будет, что может и не быть тем, что вы хотите ( никогда не увидим последние данные сервера).

Надеюсь, это поможет!