web-dev-qa-db-fra.com

xcode 7 génère une entité de données de base avec une catégorie CoreDataProperties supplémentaire

J'ai une nouvelle fonctionnalité étrange dans xcode 7, lorsque je génère une nouvelle sous-classe NSManagedObject, puis xcode crée deux classes: entité et leur catégorie CoreDataProperties, qui contiennent une implémentation complète. Dans l'image ci-dessous un exemple de ce que je veux dire.

enter image description here

Je ne trouve aucune information documentée à ce sujet, qui peut expliquer pourquoi cela fonctionne si

35
Yevgeniy Logachev

Je viens de le remarquer et je n'ai pas pu trouver de documentation à ce sujet, mais j'ai expérimenté cette nouvelle fonctionnalité et cela fonctionne comme ceci. Lorsque vous générez pour la première fois la sous-classe NSManagedObject à partir de votre modèle Core Data, Xcode générera 4 fichiers:

DBUser.h

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

NS_ASSUME_NONNULL_BEGIN

@interface DBUser : NSManagedObject

// Insert code here to declare functionality of your managed object subclass

@end

NS_ASSUME_NONNULL_END

#import "DBUser+CoreDataProperties.h"

DBUser.m

#import "DBUser.h"

@implementation DBUser

// Insert code here to add functionality to your managed object subclass

@end

DBUser + CoreDataProperties.h

#import "DBUser.h"

NS_ASSUME_NONNULL_BEGIN

@interface DBUser (CoreDataProperties)

@property (nullable, nonatomic, retain) NSNumber *id;
@property (nullable, nonatomic, retain) NSString *name;

@end

NS_ASSUME_NONNULL_END

DBUser + CoreDataProperties.m

#import "DBUser+CoreDataProperties.h"

@implementation DBUser (CoreDataProperties)

@dynamic id;
@dynamic name;

@end

Donc, comme vous pouvez le voir maintenant, toutes les propriétés sont dans un fichier séparé avec une catégorie (CoreDataProperties). Plus tard, si vous générez la sous-classe NSManagedObject pour le même modèle, Xcode 7 ne régénérera que 2 fichiers de catégorie (DBUser + CoreDataProperties.h et DBUser + CoreDataProperties.m) pour mettre à jour toutes les propriétés de votre modèle, mais il n'apportera aucune modification à 2 autres fichiers (DBUser.h et DBUser.m) afin que vous puissiez utiliser ces 2 fichiers pour y ajouter des méthodes ou des propriétés personnalisées, etc.

Dans la version précédente, Xcode ne générait toujours que 2 fichiers (DBUser.h et DBUser.m) et y mettait des propriétés de sorte que vous ne pouviez pas facilement modifier ces fichiers car votre implémentation personnalisée était supprimée à chaque fois que vous régénériez vos sous-classes. Par conséquent, il était courant de créer manuellement une catégorie et de mettre vos méthodes dans votre catégorie, ce qui était contraire à ce que nous pouvons voir dans Xcode 7. Cela avait cependant de nombreux inconvénients car nous devions utiliser une catégorie pour la mise en œuvre de nos méthodes qui ne permettent de faire certaines choses et maintenant nous pouvons facilement modifier l'interface principale et les fichiers d'implémentation ce qui nous permet de tout faire avec. Hourra!

46
Leszek Szary

Auparavant, le code généré était entré dans EntityName.h et EntityName.m que vous deviez "étendre" avec une interface telle que EntityName + Create.h et EntityName + Create.m.

Cela était difficile à comprendre pour les débutants qui modifiaient souvent la classe EntityName.m et perdaient leur code.

Maintenant, c'est dans le bon sens: le générateur de code n'effacera pas le code existant.

Les autres réponses expliquent très bien le nouveau système.

Mais personne ne parle du nouveau problème de compatibilité si vous avez des entités basées sur l'ancien système.

Ma solution: je mets toujours mon propre code dans EntityName + Create.m, mais dans EntityName + Create.h je me réfère à EntityName + CoreDataProperties.h au lieu de simplement EntityName.h (j'ai vidé le code généré précédemment dans EntityName.h et EntityName .m). Cette solution m'a évité de déplacer mon code de EntityName + Create.m et de modifier toutes les références à EntityName + Create.h.

J'espère que cela vous a aidé.

2
Nicolas Gros

Pour Swift et Xcode 7, c'est la même chose que la réponse de Leszek S mais seulement 2 fichiers sont créés initialement:

  • DBUser.Swift
  • DBUser + CoreDataProperties.Swift

Plus tard, si vous apportez des modifications au modèle CoreData et régénérez la sous-classe NSManagedObject uniquement la DBUser+CoreDataProperties.Swift est mis à jour. DBUser.Swift n'est pas modifié.

Mettez donc tout votre code dans DBUser.Swift.

0
Murray Sagal