es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Firebase Listener Llamado Múltiples Veces Cuando Cambia la Data SwiftUI

Tengo tres oyentes:

Obtener datos visibles para todos los usuarios
Obtener datos entre dos fechas
Obtener todos los datos

Sin embargo, cuando cambia algún dato de la tabla de usuario, el oyente llama automáticamente de 4 a 5 veces.

Función para escuchar datos()-> Registro de oyente{
Let oyente = db.collection(“usuario”)
.whereField(“FirstRow”, isGreaterThanOrEqualTo: “FirstRow”)
.whereField(“lastRow”, isLessThanOrEqualTo: “lastRow”)
.addSnapshotListener { querySnapshot, error in
Si hay un error, devolverá el mensaje de error
print(“listener error: (error.localizedDescription)”)
volver
}
si hay una instantánea,
Imprimir datos
print(“Sin For Each = Datos”)
snapshot.documentChanges.forEach { diff in
Imprimir los datos
print(“For Each = Data”)
}
Imprimir el mensaje
print(“Escuchar Publicar Viajes Hecho”)
}
}
Devolverá el oyente
}

Pregunta: ¿Cómo hacer que el oyente llame solo una vez cuando el usuario cambia los datos?

¿Alguien puede explicarme cómo hacer que el oyente llame solo una vez?

Cualquier ayuda sería muy apreciada.

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que el listener se llame una sola vez cuando el usuario cambie los datos, se puede usar la propiedad snapshot.metadata.isFromCache. Esta propiedad devolverá true si los datos son del caché, y false si los datos vienen del servidor.

    Se puede utilizar esta propiedad para verificar si los datos vienen del servidor, y si es así, se puede ejecutar el código dentro del listener. De esta manera, el listener se llamará solo una vez cuando el usuario cambie los datos.

    Aquí hay un ejemplo de cómo se puede utilizar la propiedad snapshot.metadata.isFromCache:

        func listenData() -> ListenerRegistration {
        let listener = db.collection("user")
            .whereField("FirstRow", isGreaterThanOrEqualTo: "FirstRow")
            .whereField("lastRow", isLessThanOrEqualTo: "lastRow")
            .addSnapshotListener { querySnapshot, error in
                if let error = error {
                    print("error del listener: \(error.localizedDescription)")
                    return
                }
                if let snapshot = querySnapshot {
                    if !snapshot.metadata.isFromCache {
                        print("Sin For Each = Datos")
                        snapshot.documentChanges.forEach { diff in
                            print("For Each = Datos")
                        }
                        print("bucl listen Public Rides Listo")
                    }
                }
            }
        return listener
    }
    

Comments are closed.