67 votes

Où placer la "Base de Données de la Pile" en Cocoa/Cacao application Tactile

Dans l'iPhone de Base du Modèle de Données, Apple endroits les Données de Base de la Pile dans l'App Délégué.

Mon inclination initiale, cependant, est de déplacer ce code dans une classe dont la responsabilité est de gérer la gestion de la Base de Données de la Pile.

Faites-vous généralement encapsuler cette fonctionnalité au sein de sa propre classe ou laissez-vous dans l'App Délégué?

39voto

mmalc Points 7663

Résumé: Il n'est pas nécessaire de créer un singleton pour gérer les Données de Base de la pile; en effet, cela est susceptible d'être contre-productif.

La Base de Données de la pile arrive à être créé par le délégué d'application. Il est important, cependant, que tous les exemples le montrent, la pile (principalement la gestion du contexte de l'objet) n'est pas récupérées directement à partir de la pile(*). Au lieu de cela, le contexte est passé à la première vue-contrôleur, et à partir d'eux à un contexte ou à un objet géré est transmis à partir d'un point de vue contrôleur à l'autre (comme décrit dans l' Accès à la Base de Données de la Pile). Cela suit le modèle de base pour l'iPhone toutes les applications: vous passez de données ou d'un contrôleur du modèle à partir d'un point de vue contrôleur à l'autre.

Le rôle typique de la singleton comme décrit ici est un modèle de contrôleur. Avec Base de Données, la gestion du contexte de l'objet est déjà un modèle de contrôleur. Il vous donne également la possibilité d'accéder à d'autres parties de la pile si nécessaire. En outre, dans certaines situations (comme décrit dans la documentation), vous pourriez vouloir utiliser un autre contexte, pour effectuer un ensemble d'actions. L'unité de monnaie pour une-vue-contrôleur est donc le plus souvent un objet géré contexte, sinon un objet géré. L'aide et le passage d'un objet singleton qui gère une pile (et à partir de laquelle vous récupérez un contexte) généralement, au mieux, introduit une inutile de niveau d'indirection, et, au pire, introduit inutile d'application de la rigidité.

(*) Pas d'exemple récupère le contexte à l'aide:

[[UIApplication delegate] managedObjectContext];

28voto

Daniel Points 16707

J'ai une classe singleton que je me laisse faire ma base de données de gestion et je ne pas le laisser sur le délégué d'application. Je préfère ne pas encombrer l'application délégué de classe avec des méthodes que j'pourriez avoir besoin pour conviniece comme aller chercher certains objets etc

11voto

Massimo Cafaro Points 18759

Je laisse les données de base de la logique dans l'Application délégué pour les raisons suivantes:

1) je ne vois pas de réel avantage dans l'avancement de ce code dans d'autres classes: la notion de délégation est parfaitement accompli par la base de données logique étant gérée par le délégué d'Application depuis la base de données modèle est en fait un élément fondamental de votre application;

2) Dans tous les exemples de code que j'ai vu, y compris Apple échantillons, les données de base des choses est gérée par le délégué d'Application;

3) Même dans la Base de Données de livres, il est de pratique courante d'avoir le délégué d'Application de la poignée de base de données connexes code;

4) Personnellement, je ne pense pas que la lisibilité ou quoi que ce soit d'autre est en fait améliorée en ayant ad hoc classes de base de données, mais c'est une question de goût personnel et je ne vais pas argumenter ici quelle approche est la meilleure. Pour moi, la simplicité, tout en conservant la fonctionnalité est importante.

10voto

Alex Points 19842

La question que je me pose, dans votre cas, est "qui fait que les Données de Base de la pile "appartenir"?" Les données lui-même est vraiment de la province de la demande, n'est-ce pas? (C. F. Base de Données sur le Mac, où vous pourriez avoir une application capable de travailler avec plusieurs documents à la fois, de sorte que les Données de Base de la pile appartient à chaque document.)

En tout Cacao/Cacao application Tactile, le Délégué d'Application est généralement le meilleur moyen de personnaliser le comportement de l'application, c'est donc le lieu naturel de la Base de Données de la pile.

Maintenant, le problème, je soupçonne que vous rencontrez, c'est qu'il se sent mal à constamment écrire des choses comme:

NSManagedObjectContext *context = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];

Ce que je fais dans ces cas est d'écrire des fonctions (pas de méthodes) comme ceci:

NSManagedObjectContext *UIAppManagedObjectContext() {
    return [*(MyAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
}

J'écris une fonction similaire pour l' NSPersistentStoreCoordinator et de la NSManagedObjectModel. J'ai mis tout ça dans l'Application du Délégué .h/.m fichiers, puisque ce sont des objets de niveau application.

6voto

Corey Floyd Points 16747

Je vais juste la liste à une nouvelle réponse. (J'ai viré mon précédent FJSCoreDataStack de classe en faveur de ce)

Ma nouvelle façon de gérer cette situation a été d'utiliser une catégorie sur NSManagedObjectContext. Ive a ajouté ce qui suit les méthodes de la classe:

+ (NSManagedObjectContext *)defaultManagedObjectContext;
+ (NSManagedObjectContext *)scratchpadManagedObjectContext;
+ (NSManagedObjectModel *)managedObjectModel;
+ (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
+ (NSString *)applicationDocumentsDirectory;

Cela permet de maintenir tout ce qui sort de mon délégué d'application, et donne singleton accès devrais-je choisir de l'utiliser. Cependant, je continue à utiliser l'injection de dépendance à partir de l'App Délégué (comme mmalc a dit, il introduit une rigidité dans mon code). J'ai simplement déplacé l'ensemble de la "Base de Données de la Pile" du code dans le NSManagedObjectCOntext Catégorie.

J'aime le passage de la référence, surtout depuis que j'ai un beau "pavé contexte" la méthode. Ce qui maintient mon point de Vue, les Contrôleurs flexible puisque je n'ai pas commis à l' "defaultManagedObjectContext".

Aussi la conversation sur l'iPhone monde (et peut avoir une incidence sur votre architecture): http://stackoverflow.com/questions/1302181/nsfetchedresultscontroller-and-constructing-nsfetchrequests/1370692#1370692

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X