web-dev-qa-db-fra.com

Modèles d'utilisation des bonnes pratiques / meilleures pratiques?

Nous sommes en train de convertir un projet pour utiliser Realm. Nous sommes vraiment impressionnés jusqu'à présent, en particulier avec le navigateur Realm (si pratique!).

En conséquence, quelques questions se sont posées et nous aimerions obtenir des modèles d'utilisation concrets avant d'aller plus loin. Notre application est fortement multi-thread (appels API, animations, etc.), alors gardez cela à l'esprit lorsque vous lisez les questions, car je sais que les instances de Realm ne sont pas accessibles sur les threads (actuellement).

  • Dans quelle mesure devrions-nous craindre de créer à plusieurs reprises des instances de Realm? Quel est le surcoût?
  • Devrions-nous prendre la peine de conserver des instances de domaine dans ViewControllers ou Singletons pour une utilisation répétée? Nous avons essayé cela, mais parfois les instances sont accessibles à partir de différents threads, nous avons donc dû revenir à la création d'une nouvelle instance à chaque fois.
  • Lors de l'accès aux propriétés de relation sur des instances de domaine, les données résultantes qui sont lues sont-elles conservées en mémoire ou sont-elles lues à chaque fois sur le disque? Doit-on s'inquiéter que les instances de domaine conservées deviennent trop volumineuses en raison d'un accès profond aux relations?
  • Quand l'actualisation d'une instance Realm est-elle nécessaire? J'ai remarqué que lorsque j'effectue des modifications dans le navigateur de domaine, elles se reflètent dans un domaine conservé sans appel d'actualisation.
    • Il semble qu'il y ait une propriété Auto-Refresh sur chaque domaine qui provoque cela selon la documentation.
  • L'accès à la propriété realm est-il une mauvaise pratique Object? Nous l'avons utilisé pour écrire dans un domaine si la fonction utilisant l'objet n'a pas créé l'objet ou le domaine (sur le même thread bien sûr).

Par exemple...

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

Merci d'avance. J'attends vos réponses avec impatience. :RÉ

72
lionpants

(Avertissement: Je travaille pour Realm. J'ai quitté Realm maintenant, mais je suis toujours heureux de vous aider!):) Merci beaucoup! C'est super d'entendre que vous appréciez Realm!

Plusieurs instances de royaume - Vous n'avez pas du tout à vous en préoccuper! Un objet de fichier de domaine est créé lors de la première instanciation sur chaque thread, et ce même objet est ensuite renvoyé chaque fois que vous essayez de l'instance à chaque fois par la suite.

Conservation des instances de domaine - Suite au premier point, non, vous n'avez pas à vous soucier de vous accrocher à Realm référence à l'intérieur d'autres objets. Comme Realm suit ses objets de fichier Realm en interne et renvoie les mêmes, vous ne serez pas pénalisé pour ne pas le faire. Cela étant dit, si avoir une référence permanente à un objet Realm à l'intérieur de votre objet simplifie la complexité de votre code, n'hésitez pas à continuer à l'utiliser.

Accès aux propriétés des relations de domaine - À strictement parler, les données des fichiers de domaine ne sont pas copiées à partir du disque (comme le ferait un ORM normal ); de plus, il utilise le mappage de la mémoire pour référencer directement les données du disque directement vers vos propriétés en mémoire. Donc, non, vous n'avez pas à vous soucier que les fichiers du domaine deviennent trop volumineux en mémoire.

Actualisation automatique  L'actualisation automatique est uniquement activée par défaut pour l'objet fichier Realm sur le thread principal. Il doit être activé manuellement pour les objets de fichier Realm sur d'autres threads, ou vous pouvez plutôt choisir de les actualiser manuellement avec l'appel de méthode refresh.

EDIT: Je me tiens corrigé! Tous les objets de fichier de domaine sur plusieurs threads ont autorefresh activé par défaut. Lorsque autorefresh est activé, le seul moment où vous devez appeler refresh est si vous avez besoin que les modifications apportées à un fichier de domaine soient reflétées dans les autres références avant que l'itération actuelle de la boucle d'exécution ait terminé.

Référencer la référence au royaume d'un objet Absolument pas, ce n'est pas du tout une mauvaise pratique! En fait, je préfère le faire dans mes propres applications personnelles qui utilisent Realm pour fournir le contexte approprié, car c'est toujours plus facile et fournit un contexte visuel plus fort entre l'objet et son fichier Realm parent dans le code. (Haha yep, s'il y avait un problème de threading ici, vous l'auriez probablement découvert avant même d'atteindre le point write).


J'espère que cela a aidé! Faites-moi savoir si vous avez besoin d'éclaircissements sur quoi que ce soit ici!

82
TiM