Personnalisée des méthodes de définition dans la Base de Données
J'ai besoin d'écrire une coutume méthode de définition d'un champ (nous allons l'appeler foo
) dans mon sous-classe de NSManagedObject
. foo
est défini dans le modèle de données et Xcode est générée automatiquement @property
et @dynamic
champs de la .h et .m des fichiers respectivement.
Si j'écris mon setter comme ceci:
- (void)setFoo: (NSObject *)inFoo {
[super setFoo: inFoo];
[self updateStuff];
}
puis je reçois un message d'avertissement du compilateur sur l'appel à super
.
Sinon, si je fais ceci:
- (void)setFoo: (NSObject *)inFoo {
[super setValue: inFoo forKey: inFoo];
[self updateStuff];
}
puis je me retrouve dans une boucle infinie.
Quelle est donc la bonne approche pour écrire un personnalisé définition pour une sous-classe de NSManagedObject?
Vous devez vous connecter pour publier un commentaire.
Ici est la Pomme façon de remplacement des NSManagedObject propriétés (sans casser KVO), dans votre .m:
managedObjectOriginal_propertyName
est un construit-dans magie méthode, vous avez juste à ajouter la définition de. Comme on le voit au bas de cette page Quoi de neuf dans la Base de Données dans macOS 10.12, iOS 10.0, tvOS 10.0, et watchOS 3.0Selon la documentation, ce serait:
C'est, bien sûr, en ignorant le fait que
NSManagedObjects
ne voulezNSNumbers
,NSDates
,NSDatas
, etNSStrings
en tant qu'attributs.Toutefois, cela pourrait ne pas être la meilleure approche. Puisque vous voulez que quelque chose se produise lorsque la valeur de votre
foo
des changements de propriété, pourquoi ne pas simplement l'observer avec Valeur De La Clé De L'Observation? Dans ce cas, ça sonne comme "KVO est la voie à suivre".NSNumber *
mais j'ai essayé de généraliser le problème. J'ai essayé ce que vous avez suggéré ci-dessus, mais j'obtiens un message d'avertissement du compilateur que ma classe ne peut pas répondre à-setPrimitivePositionX:
. Des idées? Bonne idée de ré. KVO. Où serait le meilleur endroit pour s'inscrire? Dans- (void)awakeFromInsert
? J'avais de s'inscrire dans- (void)dealloc
droit?@interface
dans la section .m fichier et qui fixe l'avertissement, mais les codes toujours pas se comporter comme prévu. J'ai besoin de déboguer ce!setPrimitiveFoo:
vous pouvez faire[super setPrimitiveValue:inFoo forKey:@"foo"];
je suis d'accord KVO devrait être mieux, mais il semble compliqué de bien s'inscrire/se désinscrire KVO dans un objet géré, et je suis inquiet au sujet de la performance dans mon cas (des centaines de milliers d'objets alloués/désallouées sansfoo
changer).willChangeValueForKey
etdidChangeValueForKey
ou cela ne marchera pas, fonctionné pour moi, merci.Voici comment je fais KVO sur le
id
attribut d'unePhoto : NSManagedObject
. Si la photo de changements d'identité, puis de télécharger la nouvelle photo.Je pense qu'il y a une petite erreur:
utilisation
au lieu de
cela fonctionne pour moi.
-(void)awakeFromFetch
et annulation de l'enregistrement dans-(void)dealloc
et j'ai maintenant mis en place et il fonctionne avec les annuler.Voici comment vous le faites 1-n (et je présume que n-m) relations:
Permet de supposer le nom de relation est appelée "étudiants" dans un objet appelé "l'École".
Vous devez d'abord définir les primitives des méthodes accesseur pour le NSMutableSet. Xcode ne génère pas automatiquement pour vous.
Ensuite, vous pouvez définir votre méthode d'accesseur. Ici, je vais remplacer le setter.