Docs Menu
Docs Home
/ /
SDK de React Native

Reaccionar a los cambios - SDK de React Native

Los objetos y colecciones de Realm siempre reflejan el estado más reciente de tus datos al leerlos. Realm emite una notificación de cambio cada vez que cambia el estado de tus datos, lo que te permite actualizar tu aplicación de forma reactiva en respuesta a una transacción de escritura confirmada.

Puede registrar tres tipos de oyentes de notificaciones:

  • Un escuchador de realm se activa cada vez que cualquier objeto en un realm cambia.

  • Un detector de colección se activa siempre que una consulta específica coincide con un nuevo conjunto de objetos o cuando cualquier objeto coincidente cambia.

  • Un detector de objetos se activa siempre que se elimina un objeto específico o se modifican una o más propiedades.

Para registrar un detector de cambios para un reino entero, pase una función de devolución de llamada al reino MétodoaddListener(). Realm llama al oyente de forma asincrónica siempre que una operación agregue, modifique o elimine objetos en el reino.

Para eliminar un oyente de reino, pase la devolución de llamada al método removeListener() del reino.

Tip

Utilice escuchas de objetos y colecciones para obtener detalles de cambios

Realm no transmite información sobre los cambios a las funciones de devolución de llamada de los escuchas de realm. Si necesita más información sobre los cambios en un objeto o una colección, utilice escuchas de objetos y de colecciones.

Tip

Manejo de excepciones dentro de un oyente

Para manejar las excepciones lanzadas desde un detector de cambios, envuelva su addListener() Llamada dentro de un try...catch declaración.

// Define a listener callback function
function onRealmChange() {
console.log("Something changed!");
}
// Add the listener callback to the realm
try {
realm.addListener("change", onRealmChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
realm.removeListener("change", onRealmChange);

Para registrar un detector de cambios para una colección de objetos de Realm, pase una función de devolución de llamada al método addListener() de la colección. Realm llama al detector de cambios asincrónicamente al registrarse, así como siempre que una operación añada, modifique o elimine objetos de la colección.

Para remover un oyente de colección, pase la función de retorno al método removeListener() de la colección.

Importante

El orden importa

En los controladores de notificaciones de colecciones, aplique siempre los cambios en el siguiente orden: eliminaciones, inserciones y modificaciones. Gestionar las inserciones antes de las eliminaciones puede provocar un comportamiento inesperado.

// You can define a listener for any collection of Realm objects
const dogs = realm.objects("Dog");
// Define a listener callback function for changes to any Dog
function onDogsChange(dogs, changes) {
// Handle deleted Dog objects
changes.deletions.forEach((index) => {
// You cannot directly access deleted objects,
// but you can update a UI list, etc. based on the index.
console.log(`Looks like Dog #${index} has left the realm.`);
});
// Handle newly added Dog objects
changes.insertions.forEach((index) => {
const insertedDog = dogs[index];
console.log(`Welcome our new friend, ${insertedDog.name}!`);
});
// Handle Dog objects that were modified
changes.modifications.forEach((index) => {
const modifiedDog = dogs[index];
console.log(`Hey ${modifiedDog.name}, you look different!`);
});
}
// Add the listener callback to the collection of dogs
try {
dogs.addListener(onDogsChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listener when you're done!
dogs.removeListener(onDogsChange);

Para registrar un detector de cambios en un objeto de Realm específico, pase una función de devolución de llamada al método addListener() del objeto. Realm llama al detector si alguna de las propiedades del objeto cambia o si alguien lo elimina.

Para eliminar un detector de objetos, pase la devolución de llamada al método removeListener() del objeto.

// Define a listener callback function for changes to a specific Dog
function onDogChange(dog, changes) {
if (changes.deleted) {
console.log(`dog is deleted: ${changes.deleted}`);
} else {
changes.changedProperties.forEach((prop) => {
console.log(`* the value of "${prop}" changed to ${dog[prop]}`);
});
}
}
// You can define a listener for any Realm object
try {
dog.addListener(onDogChange);
} catch (error) {
console.error(
`An exception was thrown within the change listener: ${error}`
);
}
// Remember to remove the listeners when you're done!
dog.removeListener(onDogChange);

Para remover todos los listeners en un objeto Realm, objeto o instancia de colección dada, llama a la función removeAllListeners() de la instancia:

// Remove all listeners from a realm
realm.removeAllListeners();
// Remove all listeners from a collection
dogs.removeAllListeners();
// Remove all listeners from an object
dog.removeAllListeners();

Los cambios en documentos anidados a más de cuatro niveles de profundidad no activan notificaciones de cambio.

Si tiene una estructura de datos en la que necesita escuchar cambios cinco niveles más abajo o más profundos, las soluciones alternativas incluyen:

  • Refactorice el esquema para reducir la anidación.

  • Agregue algo como "push-to-refresh" para permitir que los usuarios actualicen los datos manualmente.

Volver

Consulta de datos

En esta página