Estoy tratando de obtener el estado de sincronización de un documento con varias colecciones secundarias en Firestore.
La aplicación es compatible tanto en línea como fuera de línea. Antes de que el usuario cierre una pantalla, quiero comprobar si todos los datos del documento se han sincronizado con la nube .
Lo que he intentado actualmente es el atributo hasPendingWrites . Pero siempre me sale false .
db.collection("cities").doc(city.id).onSnapshot((querySnapshot)=> { console.log(querySnapshot.metadata.hasPendingWrites); });Editar: estoy actualizando documentos en colecciones anidadas de la ciudad. ¿Puede ser el problema?
La estructura de mi colección
cities document (which I'm listening to the sync status) ├─── leaders collection (which I'm updating) ├─── fleet collection (which I'm updating) ├─── roads collection (which I'm updating) ├─── maps collection (which I'm updating)collectionGroup es una función especial que le permite acceder a las colecciones desde sus nombres, independientemente de dónde se encuentren.
La ventaja es que le permite acceder a subcolecciones en varios documentos. Por lo tanto, puede tener collectionGroup('leaders') en lugar de colección ('líderes') y es a él que adjuntará el oyente de instantáneas de hasPendingWrites. Y tendría que hacer lo mismo para las otras subcolecciones como 'flota', 'carreteras' y 'mapas'.
Tenga en cuenta que esto podría aumentar innecesariamente los costos de lectura/escritura de los documentos en Firebase cuando su producción escala.
Tenga partes de la interfaz de usuario que permitan al usuario conocer la importancia de su conexión a Internet. Tal vez impidiendo el acceso por completo, mostrando algún vector o banner si el usuario no tiene buena conexión a Internet.
Esta solución es mejor porque detectar el estado de sincronización por su cuenta sería una exageración. No es solo una cosa de Firebase. Incluso si estuviera implementando WebSockets personalizados por su cuenta. Además, Firebase ya tiene propiedades de sincronización automática, que es el método .onSnapshot() en sí.
Además, ¿no puede saber si el usuario está intentando desinstalar una aplicación móvil cuando no está conectado a Internet? No se puede sincronizar y se perderán los datos. Por lo tanto, es mejor hacerles sentir que el producto es más un producto en línea. Además, casi todo está en línea hoy.