Cómo eliminar object en Realm de manera adecuada y segura para subprocesss

Acabo de empezar a usar Realm y siento que es muy bueno, rápido excepto una cosa: eliminar un object en Realm es fácilmente causar una exception.

¿Hay alguna manera de que pueda eliminar un object en la security de Realm?

En mi proyecto, por lo general tengo que crear, actualizar, eliminar cientos de objects en el hilo de background. El problema es:

  • Si la aplicación actualmente muestra / usa un object en el hilo principal
  • En segundo plano, elimino ese object. => En el hilo principal causará una exception al usar las properties de ese object.

Sé que Realm tiene un método Invalid para verificar, pero no puedo agregar el cheque en cada código de properties de asignación, no se ve bien.

Entonces, a partir de ahora, lo que hago es: en lugar de eliminar, tengo una propiedad llamada "eliminado", y en eliminar, solo actualizo ese valor. Y en la interfaz de usuario, filtraré los objects que han borrado = true

Me pregunto ¿hay alguna manera mejor de hacer esto?

Esta es la funcionalidad prevista. Si un hilo de background elimina un Object reino, la próxima vez que intente acceder a ese object desde cualquier hilo, se lanzará una exception.

Para manejar esto, Realm proporciona un sistema de notificación enriquecido que puede usar para recibir automáticamente alertas sobre cuándo se han cambiado los contenidos de una database de Realm y para actualizar la UI en consecuencia.

Si tiene un controller de visualización que muestra los contenidos de un único Object Realm, podría implementar un sistema para notificarle de cualquier cambio que se realice en su database de Realm y, a continuación, comprobar que su object sigue siendo válido:

 class MyViewController : UIViewController { var myModel: Object = nil var notificationToken: NotificationToken? = nil init(model: Object) { self.myModel = model } override fun viewDidLoad() { super.viewDidLoad() notificationToken = myModel.realm.addNotificationBlock { notification, realm in guard myModel.invalidated == false else { // The object has been deleted, so dismiss this view controller } } } deinit() { notificationToken?.stop() } } 

Ese bloque de notificación se activará cada vez que una transacción de escritura modifique algo en ese file de dominio particular (incluso en subprocesss de background), lo que le da la oportunidad de comprobar si su Object dominio particular en esa interfaz de usuario no se ha eliminado. Si lo tiene, entonces simplemente puede descartar la interfaz de usuario.

Dependiendo de sus necesidades específicas, también hay un sistema de notificación de grano más fino que puede usar para rastrear específicamente los cambios a Objects dominio que formaban parte de los resultados de una consulta. Hay un código de ejemplo para eso en las notifications de recostackción de la documentation de Realm.

¡Avíseme si necesita una aclaración adicional! 🙂

    Intereting Posts