¿Qué sucede realmente cuando la persistencia está habilitada en Firebase?

Al activar la persistencia de Firebase en iOS, ¿qué ocurre realmente con mis observadores y cómo se comportan a nivel técnico?

Tengo una buena idea de cómo debería funcionar en un alto nivel basado en este https://www.firebase.com/docs/ios/guide/offline-capabilities.html – Firebase básicamente mantiene una copia en caché de los datos que usted puede acceder sin conexión.

Lo que no entiendo es cuántas veces deben disparar mis observadores y con qué información.

  • Firebase siempre activa mis observadores una vez con cualquier información en caché primero (o nulo si no hay ningún dato) seguido de los datos del servidor.
  • O solo envía los datos almacenados en caché si existen, seguidos de los datos del servidor.
  • ¿Hay alguna diferencia entre el observadorSingleValue y el comportamiento de un observador continuo cuando está en modo de persistencia?

En nuestra aplicación con persistencia habilitada, he notado:

  • Firebase acaba de enviar los datos del servidor
  • Firebase envía los datos almacenados en caché, si existen, a continuación, los datos del servidor.
  • Firebase envía los datos en caché y null si no existe, seguido de los datos del servidor.

Sería bueno aclarar esto para saber cuál debería ser el comportamiento normal 🙂

En realidad es bastante simple. Cuando adjuntas un observador (ya sea usando observeEventType u observeSingleEventOfType ), Firebase:

  1. Inmediatamente levante eventos con cualquier información en caché completa .
  2. Solicite datos actualizados del servidor y, cuando llegue, genere nuevos eventos si los datos son diferentes a los almacenados en caché.

Sin embargo, hay un par de sutilezas que caen de esto:

  • Solo publicaremos eventos con datos en caché si están completos . Esto significa:
    • Si no tenemos datos almacenados en caché (no ha observado esta ubicación anteriormente), no generaremos eventos con nulo o similar. No obtendrá ningún evento hasta que obtengamos datos del servidor.
    • Si tiene datos parciales para esta ubicación (por ejemplo, observó / foo / bar anteriormente pero ahora está observando / foo), obtendrá eventos ChildAdded para niños completos (por ejemplo / foo / bar), pero no obtendrá un Value evento (por ejemplo, para / foo) hasta que hayamos obtenido los datos completos del servidor para la ubicación que está observando.
  • Si usa observeSingleEventOfType , está pidiendo explícitamente solo un evento y, por lo tanto, si tiene datos almacenados en caché, se producirá el # 1 pero el # 2 no, que puede no ser el que desea (nunca verá la última) datos del servidor).

¡Espero que esto ayude!