2015-12-03 1 views
0

La propriété de sous-classe NSManagedObject est créée dans son fichier de catégorie, qui est très câblé car la catégorie ne peut avoir que la méthode. Les détails sont comme ci-dessous:Propriété de sous-classe NSManagedObject dans la catégorie

(1) .J'ai créé une entité appelée BibleAudio dans le fichier .xcdatamodeld avec plusieurs attributs comme ci-dessous.

enter image description here

(2). XCode fichiers générés objectifs c sont "BibleAudio + CoreDataProperties.h", "BibleAudio + CoreDataProperties.m" et "BibleAudio.h", "BibleAudio.m" comme suit:

enter image description here

(3). dans "BibleAudio + CoreDataProperties.h", les attributs de BibleAudio sont déclarés comme propriété ici (voir ci-dessous); alors que dans "BibleAudio.h", il est vide. Pour autant que je sache, "BibleAudio + CoreDataProperties.h" est un fichier de catégorie et seule la méthode peut être déclarée ici. Ainsi, à mon avis, la bonne façon est de déclarer la propriété dans "BibleAudio.h", et si vous voulez ajouter une méthode pour cette sous-classe NSManagedObject, vous devez utiliser une catégorie pour ajouter cette méthode.

BibleAudio + CoreDataProperties.h BibleAudio + CoreDataProperties.h

BibleAudio.h BibleAudio.h

Quelqu'un sait-il si ma compréhension avait raison? ou si j'avais tort, quelle est la logique derrière cela?

Répondre

5

Dans les versions précédentes de Xcode,, seule une classe était créée pour chaque entité de base de données , par ex. la classe "BibleAudio" au BibleAudio.h/.m. Ces fichiers ont été remplacés chaque fois que vous avez recréé les sous-classes d'objets gérés. Par conséquent, pour ajouter votre propre fonctionnalité à la classe Core Data, vous devez définir une catégorie (dans des fichiers séparés) sur la classe.

Le grand inconvénient est que vous pouvez ajouter méthodes dans les catégories de classe, mais pas variables d'instance. Vous ne pouvez donc pas ajouter une propriété simple (sauvegardée par une variable d'instance). Une solution possible était de définir une propriété transitoire dans l'entité, mais cela avait également inconvénients.

Maintenant Xcode crée une classe « BibleAudio » (en BibleAudio.h/.m) qui est essentiellement vide, et une catégorie « BibleAudio (CoreDataProperties) » dans BibleAudio + CoreDataProperties.h/.m Les fichiers catégorie contiennent toutes les propriétés de base de données et sont écrasé lorsque vous recréez les sous-classes d'objets gérés.

Les fichiers de classe BibleAudio.h/.m sont créés une seule fois et ne sont jamais remplacés. Vous pouvez y ajouter des fonctionnalités: des méthodes comme précédemment, mais aussi des propriétés personnalisées et des variables d'instance.Parce que c'est une classe et pas une catégorie, les anciennes restrictions ne s'appliquent plus.

+0

Votre réponse vraiment aider! J'ai une question que quel est le mécanisme de BibleAudio + CoreDataProperties.h/.m (une catégorie) déclarent la propriété. Pouvons-nous aussi déclarer la propriété pour notre propre classe dans la catégorie? – Johnson

+0

@Johnson: Les propriétés * Core Data * peuvent être définies dans une catégorie car elles ne sont pas sauvegardées par des variables d'instance mais par le contexte d'objet géré, le getter et le setter sont créés dynamiquement à l'exécution (ils sont marqués '@ dynamic' dans le fichier de catégorie .m). - Toute * votre * personnalisation est faite dans les fichiers de classe, pas dans les fichiers de catégorie. –