2010-06-11 3 views
4

La documentation est assez déroutant sur celui-ci:A quoi ressemble une implémentation de méthode d'accesseur personnalisée dans Core Data?

La mise en œuvre des méthodes accesseurs vous écrivez pour les sous-classes de NSManagedObject est généralement différente de ceux que vous écrivez pour d'autres classes.

Si vous ne fournissez pas les variables personnalisées par exemple , vous extrayez la propriété valeurs et de sauvegarder les valeurs dans le magasin interne à l'aide primitives méthodes accesseurs. Vous devez vous assurer que vous invoquez l'accès pertinent et changement des méthodes de notification (willAccessValueForKey :, didAccessValueForKey :, willChangeValueForKey :, didChangeValueForKey :, willChangeValueForKey: withSetMutation: usingObjects :, et didChangeValueForKey: withSetMutation: usingObjects :) . NSManagedObject désactive automatiquement valeur clé d'observation (KVO, voir valeurs-clés d'observation Guide de programmation) notifications de changement, et les méthodes accesseurs primitives ne l'accès et invoquent changement méthodes de notification.

Dans les méthodes accesseurs pour les propriétés qui ne sont pas définies dans l'entité modèle, vous pouvez activer les notifications de changement automatique ou invoquer la méthode de communication de changements appropriés .

Y a-t-il des exemples qui montrent à quoi cela ressemble?

Répondre

11

Si vous allez dans l'éditeur de modèle de données, sélectionnez l'attribut d'entité, puis choisissez "Copier l'implémentation de la méthode dans le Presse-papiers". Il va générer des accesseurs pour vous. Voici les accesseurs pour la valeur par défaut « timestamp » la propriété dans un projet de modèle de données de base:

- (NSDate *)timeStamp 
{ 
    NSDate * tmpValue; 

    [self willAccessValueForKey:@"timeStamp"]; 
    tmpValue = [self primitiveValueForKey:@"timeStamp"]; 
    [self didAccessValueForKey:@"timeStamp"]; 

    return tmpValue; 
} 

- (void)setTimeStamp:(NSDate *)value 
{ 
    [self willChangeValueForKey:@"timeStamp"]; 
    [self setPrimitiveValue:value forKey:@"timeStamp"]; 
    [self didChangeValueForKey:@"timeStamp"]; 
} 

L'idée de base est ici que vous devez mettre entre parenthèses tout changement de valeur primitive avec willChange... et didChange... appels de telle sorte que le contexte sait quelque chose est en train d'être changé.

Vous n'avez généralement pas besoin de jouer avec vos propres accesseurs sauf si vous avez des effets secondaires pour définir l'attribut.

+0

Hé mec, c'est un truc génial! Merci! – dontWatchMyProfile

+2

L'option "Copier la méthode d'implémentation dans le Presse-papiers" a-t-elle été supprimée dans Xcode 5? Je ne peux pas le trouver. –