Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

283
Vistas
Sincronización de dominios con una gran colección en Firestore: preguntas/problemas arquitectónicos

Tengo una colección de objetos de productos (título, descripción, precio, cantidad, urlString, etc.) en una colección de Firestore. Actualmente alrededor de 1000 artículos, pero eso podría llegar a 10k. En el lanzamiento de mi aplicación iOS, configuré un oyente de colección ( db.collection("products").rx.listen() ) que luego guarda los cambios en una base de datos local de Realm.

 .subscribe(onNext: { querySnapshot in querySnapshot.documentChanges.forEach { docChange in autoreleasepool { let realm = try! Realm(configuration: Realm.Configuration.defaultConfiguration) let newData = docChange.document.data() if let item = itemFactory.createItem(using: newData) { if (docChange.type == .added) { //realm.add(item) } if (docChange.type == .modified) { //realm.update(item) } if (docChange.type == .removed) { //realm.delete(item) } } } } }, onError: { error in print("Error fetching snapshots: \(error)") }).disposed(by: disposeBag)

He leído los documentos de Firestore en detalle, pero no estoy 100% seguro de que este enfoque sea confiable o eficaz.

Pregunta: Cuando se inicie la aplicación, ¿Firestore descargará los 10.000 documentos cada vez antes de describir los cambios? O almacenará en caché los 10k la primera vez y luego solo descargará los cambios en los lanzamientos posteriores. Estoy seguro de que una vez que se activa un evento de cambio, todos los eventos posteriores solo recogerán cambios en la base de datos de Firestore. Lo que me preocupa es suscribirse primero al oyente cuando se inicia la aplicación, descarga los 10k elementos (lo que sería costoso).

EDITAR 9 de enero de 2019:

Terminé implementando la respuesta elegante de @zavtra con un código más o menos así:

 var newestUpdatedAt = UserDefaults.standard.double(forKey: kUDItemUpdatedAt) //... db.collection(kProducts) .whereField(kUpdatedAt, isGreaterThan: newestUpdatedAt) .rx.listen() //... querySnapshot.documentChanges.forEach { docChange in autoreleasepool { let realm = try! Realm(configuration: Realm.Configuration.defaultConfiguration) let newData = docChange.document.data() if let item = itemFactory.createItem(using: newData) { if item.updatedAt > newestUpdatedAt { newestUpdatedAt = item.updatedAt } if (docChange.type == .added) { //realm.add(item) } if (docChange.type == .modified) { //realm.update(item) } if (docChange.type == .removed) { //realm.delete(item) } } } } UserDefaults.standard.set(newestUpdatedAt, forKey: kUDItemUpdatedAt)
over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Según los documentos:

docChanges devuelve una matriz de los cambios en el documento desde la última instantánea. Si esta es la primera instantánea, todos los documentos estarán en la lista como cambios "agregados".

Cada vez que reinicie la aplicación, se activará este comportamiento de "primera instantánea". Si desea evitar este comportamiento, tendría que:

  1. Recupere el documento más reciente guardado localmente, con su marca de tiempo.
  2. Cree una consulta donde todos los documentos comiencen en esa marca de tiempo (es decir, la marca de tiempo de cada documento es, como mínimo, la marca de tiempo guardada más recientemente)
  3. Suscríbase a los cambios en esa consulta en la entrada de la aplicación.

Para hacer esto, deberá agregar un campo de marca de tiempo a cada documento y una regla "indexOn" en sus reglas de Firestore en el campo de marca de tiempo para evitar la descarga y clasificación de toda la colección por parte del cliente.

over 4 years ago · Santiago Trujillo Denunciar

0

Cuando se inicie la aplicación, ¿Firestore descargará los 10.000 documentos cada vez antes de describir los cambios?

Cuando está escuchando cambios en Cloud Firestore para cambios en tiempo real, utilizando el método addSnapshotListener() de Firestore Query:

Comienza a escuchar esta consulta.

Lo que básicamente significa que la primera vez que adjunta el oyente, obtiene todos los documentos que corresponden a esa consulta en particular.

O almacenará en caché los 10k la primera vez y luego solo descargará los cambios en los lanzamientos posteriores.

Debido a que Firestore tiene la persistencia sin conexión habilitada de manera predeterminada, significa que una vez que realiza una consulta, los resultados se almacenan en el dispositivo del usuario. Además, cada vez que cambia una propiedad dentro de un documento, se le notifica de acuerdo con ese cambio. Obviamente, esto sucede solo si el oyente permanece activo y no se elimina. Entonces, si no se cambia nada en la base de datos, obtiene todos los datos del caché.

Como también mencionó @zavtra en su respuesta, puede agregar debajo de cada objeto de su colección una propiedad de Date ( así es como puede agregarla) y consultar su base de datos en el cliente, de acuerdo con esta nueva propiedad, para todos los documentos que han cambiado desde un tiempo anterior.

También recomiendo ver la respuesta de Doug Stevenson de esta publicación , para una mejor comprensión.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda