Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Kit de desarrollo de software de Swift

CRUD - SDK de Swift

Realm uses a highly efficient storage engine to persist objects. You can create objects in a realm, update objects in a realm, and eventually delete objects from a realm. Because these operations modify the state of the realm, we call them writes.

Realm handles writes in terms of transactions. A transaction is a list of read and write operations that Realm treats as a single indivisible operation. In other words, a transaction is all or nothing: either all of the operations in the transaction succeed or none of the operations in the transaction take effect.

All writes must happen in a transaction.

Un entorno Realm sólo permite una transacción abierta a la vez. Realm bloquea otras escrituras en otros hilos hasta que la transacción abierta se complete. Por lo tanto, no hay condición de competencia al leer valores desde el realm dentro de una transacción.

Cuando finalices tu transacción, Realm la confirma o la cancela:

  • Cuando Realm confirma una transacción, Realm guarda todos los cambios en el disco. Para los realms sincronizados, el SDK pone en cola el cambio para la sincronización con Atlas Device Sync.

  • Cuando Realm cancela una transacción de escritura o una operación en la transacción provoca un error, todos los cambios se descartan (o se "revierten").

El SDK de Swift representa cada transacción como una función de devolución de llamada que contiene cero o más operaciones de lectura y escritura. Para ejecutar una transacción, defina una devolución de llamada de transacción y pásela al dominio. write Método. Con esta devolución de llamada, puede crear, leer, actualizar y eliminar datos en el reino. Si el código de la devolución de llamada genera una excepción al ejecutarse, Realm cancela la transacción. De lo contrario, Realm confirma la transacción inmediatamente después de la devolución de llamada.

Importante

Preocupaciones sobre la concurrencia

Dado que las transacciones se bloquean entre sí, es mejor evitar abrir transacciones tanto en el hilo de la interfaz de usuario como en un hilo en segundo plano. Si está utilizando Sincronización: evite abrir transacciones en el hilo de la interfaz de usuario, ya que Realm procesa las sincronizaciones en un hilo en segundo plano. Si una transacción en segundo plano bloquea la transacción de su hilo de la interfaz de usuario, su aplicación podría parecer inoperante.

Ejemplo

The following code shows how to run a transaction with the realm's write method. If the code in the callback throws an exception, Realm cancels the transaction. Otherwise, Realm commits the transaction.

// Open the default realm.
RLMRealm *realm = [RLMRealm defaultRealm];
// Open a thread-safe transaction.
[realm transactionWithBlock:^() {
// ... Make changes ...
// Realm automatically cancels the transaction in case of exception.
// Otherwise, Realm automatically commits the transaction at the
// end of the code block.
}];
// Open the default realm.
let realm = try! Realm()
// Prepare to handle exceptions.
do {
// Open a thread-safe transaction.
try realm.write {
// Make any writes within this code block.
// Realm automatically cancels the transaction
// if this code throws an exception. Otherwise,
// Realm automatically commits the transaction
// after the end of this code block.
}
} catch let error as NSError {
// Failed to write to realm.
// ... Handle error ...
}

Realm siempre envía notificaciones de forma asíncrona, por lo que nunca bloquean el hilo de la interfaz de usuario. Sin embargo, hay situaciones en las que la interfaz de usuario debe reflejar los cambios al instante. Si actualiza la interfaz de usuario directamente al mismo tiempo que escribe, la notificación podría duplicar la actualización. Esto podría provocar el bloqueo de la aplicación debido a una inconsistencia de estado entre la interfaz de usuario y el almacén de datos de respaldo. Para evitar esto, puede escribir sin enviar una notificación a un controlador específico. A este tipo de transacción lo llamamos escritura dirigida por la interfaz.

Ejemplo

Supongamos que decidimos administrar manualmente la fuente de datos de una vista de tabla, porque el diseño de nuestra aplicación requiere una respuesta instantánea a las actualizaciones de tabla impulsadas por la Interfaz de Usuario. Tan pronto como un usuario agrega un elemento a la vista de la tabla, lo insertamos en nuestra fuente de datos, que guarda en el realm pero también activa inmediatamente la animación. Sin embargo, cuando Realm entrega la notificación de cambio para esta inserción un poco más tarde, indica que se ha agregado un objeto. ¡Pero ya actualizamos la tabla para ello! En lugar de escribir código complejo para manejar este caso, podemos utilizar guardados orientados a interfaces para evitar que un controlador de notificación específico se active para ese guardado particular.

Las escrituras controladas por interfaz, también conocidas como escrituras silenciosas, son especialmente útiles al usar notificaciones de recopilación detalladas con un dominio sincronizado. Mientras que las escrituras controladas por interfaz se usan para las actualizaciones del usuario actual y actualizan la interfaz de usuario inmediatamente, el proceso de sincronización puede usar notificaciones estándar para actualizar la interfaz de usuario.

Tip

Volver

Datos del modelo con sincronización de dispositivos

En esta página