2010-07-26 8 views
6

J'utilise CoreData dans ma dernière application iPhone. Je trouve cela complexe au début mais je suppose que c'est le meilleur choix lorsque vous avez besoin de stocker des objets dans une application iPhone (http://inessential.com/2010/02/26/on_switching_away_from_core_data).Meilleures pratiques CoreData

Existe-t-il des bonnes pratiques lors de l'utilisation de CoreData dans une application iPhone? Par exemple, je ne veux pas que tous mes contrôleurs traitent ce NSManagedObjectContext dont vous avez besoin lorsque vous souhaitez effectuer des requêtes. Définissez-vous une classe uniquement pour les requêtes CoreData?

+0

Merci BoltClock, je ne connaissais pas cette fonctionnalité! –

+0

duplicata possible de [Où placer le "Core Data Stack" dans une application Cocoa/Cocoa Touch] (http://stackoverflow.com/questions/1267520/where-to-place-the-core-data-stack-in -a-cacao-cacao-application-tactile) –

Répondre

6

Je crée généralement un objet dédié à gérer ma pile de données de base et des objets connexes et les comportements. Ceci est utile car il y a beaucoup de plaque de chaudière avec des données de base afin que je puisse créer une classe de gestionnaire de base générique et ensuite utiliser une sous-classe pour chaque application. Je l'appelle habituellement AppNameDataModel.

Je préfère masquer le contexte d'objet géré dans l'objet DataModel. Cela force les autres objets de l'application à demander à l'objet DataModel d'accéder à la pile de données de base, ce qui assure une bonne encapsulation et sécurité.

Habituellement, je crée des méthodes dans la classe DataModel pour retourner des extractions pour des entités, par ex.

-(NSFetchRequest *) entityNameFetch; 

... et ont une méthode performFetch dans le DataModel. En cours d'utilisation, un contrôleur demande une extraction pour une entité, configure l'extraction, puis demande au DataModel d'effectuer l'extraction et de renvoyer les résultats. Vous pouvez écrire la génération des méthodes qui retournent l'extraction et la récupération de la plaque de la chaudière. Tout cela fait gagner beaucoup de temps, surtout lors du prototypage. Une référence à l'instance DataModel elle-même peut être transmise du contrôleur au contrôleur mais je pense que c'est une utilisation valide du pattern singleton donc je fais souvent du DataModel un singleton et je fournis une catégorie sur UIViewController pour qu'une propriété y accède .Cela signifie que tout contrôleur de vue que j'ajoute au projet a automatiquement accès au DataModel.

Ce modèle maintient tout bien encapsulé et modulaire. Cela facilite l'ajout de nouvelles vues ou le partage du modèle de données entre les projets. Il faut un peu de travail à mettre en place au départ, mais une fois que vous avez la classe de base, l'utilisation future est massivement accélérée.

1

Merci Brad pour cette question.

Comme mentionné dans la documentation Apple [1], le contexte doit être transmis à chaque nouveau contrôleur de vue qui a besoin de CoreData.

Sur iPhone:

Par convention, vous pouvez souvent obtenir un contexte d'un contrôleur de vue. C'est à vous, cependant, de suivre ce modèle. Lorsque vous implémentez un contrôleur de vue qui s'intègre aux données de base, vous pouvez ajouter une propriété NSManagedObjectContext. Un contrôleur de vue ne doit généralement pas extraire le contexte d'un objet global tel que le délégué d'application. Cela tend à rendre l'architecture de l'application rigide. Un contrôleur de vue ne devrait pas non plus créer un contexte pour son propre usage. Cela peut signifier que les opérations effectuées en utilisant le contexte du contrôleur ne sont pas enregistrées dans d'autres contextes, de sorte que les différents contrôleurs de vues auront des perspectives différentes sur les données. Lorsque vous créez un contrôleur de vue, vous lui transmettez un contexte.

Vous passez un contexte existant, ou (dans une situation où vous voulez que le nouveau contrôleur gère un ensemble discret de modifications) un nouveau contexte que vous créez pour lui. Il est généralement de la responsabilité du délégué de l'application de créer un contexte à transmettre au premier contrôleur de vue affiché.

[1] - http://developer.apple.com/iphone/library/documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/stack.html#//apple_ref/doc/uid/TP40008283