2010-12-04 20 views
1

Je suis toujours en train de m'habituer au fonctionnement des données de base et j'ai cherché des informations sur mon problème mais je n'ai trouvé aucune réponse problème.Mise à jour de l'objet Données de base lorsqu'une propriété de l'objet associé change

J'ai trois classes d'objets gérés: prêt, emprunteur et photo. Les objets emprunteurs ont une relation un-à-plusieurs avec les objets de prêt (ce qui signifie qu'un emprunteur peut avoir plus d'un prêt mais qu'un prêt ne peut avoir qu'un seul emprunteur). Les objets emprunteur ont également une relation un-à-un avec un objet photo. J'utilise un NSFetchedResultsController pour maintenir une table à jour avec les changements dans un ensemble d'objets de prêt. Lorsque d'autres propriétés de l'emprunteur changent, la notification de modification atteint NSFetchedResultsController et mes mises à jour de table. Mais lorsque la propriété de la photo change pour pointer vers un autre objet photo, aucune notification n'est transmise au NSFetchedResultsController. Il semble qu'aucun des prêts qui sont liés à l'emprunteur n'est raconté lorsque l'emprunteur change sa relation photo.

Aidez s'il vous plaît!

Répondre

2

Vous pouvez essayer de gérer la notification NSManagedObjectContextObjectsDidChangeNotification.

+0

+1 Ceci est la meilleure option. Cette circonstance est ce que les notifications sont pour. – TechZen

+0

Cool, cela a fonctionné comme un charme. Merci à tous ceux qui ont aidé! –

0

C'est un peu squirrelly, mais vous pourriez faire ce qui suit, en supposant que vous avez sous-classé NSManagedObject pour les classes Loan, Emprunteur et Photo. 1. Dans Prêt, configurez KVO pour la propriété 'image' de la photo du prêt.

2.) Dans Prêt, ajoutez la propriété changeCount (NSNumber *).

3.) Lorsqu'un crédit est alerté pour changer l'image de sa photo, incrémenter changeCount.

Ainsi, très rude Code, quelque chose comme ceci:

dans Load.m:

- (void) awakeFromFetch 
    { 
    [super awakeFromFetch]; 

    [[self photo] addObserver:self 
     forKeyPath:@"image" 
     options:NSKeyValueObservingOptionNew 
     context:nil]; 
    } 


- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
    { 
    if ([keyPath isEqualToString:@"image"]) 
     { 
     NSInteger temp = [[self changeCount] intValue]; 
     ++temp; 
     [self setChangeCount:[NSNumber numberWithInteger:temp]]; 
     } 
    } 

Il y a quelques mises en garde.

1) Ceci ne concerne que 'fetch' et pas avec 'insert' (c'est-à-dire, nouveaux prêts).

2) Cela suppose qu'un prêt récupéré aura une photo.

3) Cela suppose que vous avez ajouté la propriété 'changeCount' à Loan.

4) Je n'ai pas testé cela, bien que j'utilise des mécanismes similaires à distance dans une de mes applications.

+0

Pourriez-vous me montrer un exemple de code? Je ne suis pas encore très familier avec KVO ou comment spécifier le chemin clé du prêt à la propriété d'image de la photo de l'emprunteur. –

+0

Croquis de code ajouté. – westsider

+0

Ok, je pense que je peux travailler avec ce code. Merci! Le seul changement est que c'est l'emprunteur qui a la photo, pas le prêt. Donc, je devrais en fait modifier le code pour observer la propriété d'image de l'emprunteur du prêt. Dans ce cas, le chemin clé serait-il "borrower.image" au lieu de simplement "image"? –