¿Patrones de uso adecuados / mejores prácticas de Realm?

76

Estamos en el proceso de convertir un proyecto para usar Realm. Estamos realmente impresionados hasta ahora, especialmente con Realm Browser (¡muy útil!).

Como resultado, han surgido algunas preguntas y nos gustaría conocer algunos patrones de uso concretos antes de continuar. Nuestra aplicación tiene varios subprocesos (llamadas a la API, animaciones, etc.), así que tenlo en cuenta al leer las preguntas, ya que sé que no se puede acceder a las instancias de Realm a través de subprocesos (actualmente).

  • ¿Cuán preocupados deberíamos estar por crear repetidamente instancias de Realm? ¿Qué es la sobrecarga?
  • ¿Deberíamos molestarnos en retener las instancias de Realm en ViewControllers o Singletons para uso repetido? Hemos intentado esto, pero a veces se accede a las instancias desde diferentes subprocesos, por lo que tuvimos que volver a crear una nueva instancia cada vez.
  • Al acceder a las propiedades de relación en las instancias de Realm, ¿los datos resultantes que se leen se retienen en la memoria o se leen desde el disco cada vez? ¿Tenemos que preocuparnos de que las instancias de Realm retenidas se vuelvan demasiado grandes debido al acceso profundo a las relaciones?
  • ¿Cuándo es necesario actualizar una instancia de Realm? He notado que cuando hago cambios en el navegador de Realm, se reflejan en un Realm retenido sin llamar a actualizar.
    • Parece que hay una propiedad de actualización automática en cada reino que causa esto de acuerdo con la documentación.
  • ¿Es realmuna Objectmala práctica acceder a la propiedad ? Hemos usado esto para escribir en un Reino si la función que usa el objeto no creó el objeto o el Reino (en el mismo hilo, por supuesto).

Por ejemplo...

func saveStuff(thingToUpdate: Object?) {
   if let thingToUpdate = thingToUpdate, let realm = thingToUpdate.realm {
       realm.write {
           thingToUpdate.name = "lionpants"
       }
   }    
}

Gracias por adelantado. Espero sus respuestas. :RE

pantalones de leon
fuente

Respuestas:

85

(Descargo de responsabilidad: Trabajo para Realm.¡Dejé Realm ahora, pero todavía estoy feliz de ayudar!) :) ¡ Muchas gracias! ¡Es genial saber que estás disfrutando de Realm!

Instancias de varios reinos : ¡no necesita preocuparse por esto en absoluto! Un objeto de archivo Realm se crea en la primera instanciación en cada hilo, y ese mismo objeto se devuelve posteriormente cada vez que intentas crear una instancia de él cada vez que lo hace.

Retención de instancias de Realm : siguiendo desde el primer punto, no, no necesita preocuparse por aferrarse a la referencia de Realm dentro de otros objetos. Como Realm rastrea sus objetos de archivo Realm internamente y devuelve los mismos, no se le penalizará por no hacerlo. Dicho esto, si tener una referencia permanente a un objeto Realm dentro de su objeto simplifica la complejidad de su código, no dude en seguir usándolo.

Acceso a las propiedades de relación de Realm : estrictamente hablando, los datos de los archivos de Realm no se copian del disco (como lo haría un ORM normal); más, utiliza la asignación de memoria para hacer referencia directamente a los datos del disco directamente a sus propiedades en la memoria. Entonces, no, no necesita preocuparse de que los archivos de Realm ocupen demasiado espacio en la memoria.

Autorefrescar La actualización automática solo está habilitada de forma predeterminada para el objeto de archivo Realm en el hilo principal. Debe habilitarse manualmente para los objetos de archivo Realm en otros subprocesos, o puede optar por actualizarlos manualmente con la refreshllamada al método.

EDITAR: ¡ Estoy corregido! Todos los objetos de archivo de Realm en varios subprocesos tienen activado autorefreshde forma predeterminada. Cuando autorefreshestá activado, la única vez que necesita llamar refreshes si necesita que los cambios realizados en un archivo Realm se reflejen en las otras referencias antes de que se complete la iteración actual del ciclo de ejecución.

Hacer referencia a la referencia de reino de un objeto ¡ Absolutamente no, no es una mala práctica en absoluto! De hecho, prefiero hacer esto en mis propias aplicaciones personales que usan Realm para proporcionar el contexto adecuado, ya que invariablemente es más fácil y proporciona un contexto visual más sólido entre el objeto y su archivo principal de Realm en el código. (Jaja sí, si hubiera un problema de enhebrado aquí, probablemente lo habrías descubierto antes incluso de llegar alwritepunto).


¡Espero que haya ayudado! ¡Avísame si necesitas aclaraciones sobre algo aquí!

TiM
fuente
¡Fantástico! Gracias por la respuesta súper rápida. ¡Nos aseguraremos de publicar más preguntas a medida que surjan! El punto de que la actualización automática solo está habilitada de forma predeterminada en el hilo principal probablemente también debería agregarse a la documentación. :)
lionpants
4
¡De ningún modo! ¡Muchas gracias! Ahh, en realidad me corrijo. Regresé y verifiqué el código para confirmarlo, y parece que la actualización automática está habilitada de forma predeterminada en todos los subprocesos ahora. Actualicé mi respuesta para reflejar eso.
TiM
Estoy realmente estresado por este problema sobre la excepción de memoria y parece que no puedo
evitarlo
¿Para iOS? ¿Puede crear un problema al respecto con más información sobre el repositorio de Realm GitHub? github.com/realm/realm-cocoa
TiM