2010-09-17 16 views
0

J'ai un modèle de données, composé principalement de « contenu » et un NSMutableArray NSMutableDictionary « contentsByName ». J'ai des objets ViewController que je souhaite observer les changements dans le modèle de données.Lors du déclenchement manuel d'un événement KVO, le dictionnaire des modifications peut-il être modifié?

J'ai une propriété "count" sur le modèle qui retourne la taille du tableau 'contenu' et je peux déclencher une observation de changement KVO avec willChange: et didChange :. Jusqu'ici tout va bien. Cependant, les view-controllers sont maintenant conscients que le modèle a changé, mais ne savent pas ce qui a été ajouté. Idéalement, j'ai besoin de mettre des informations supplémentaires dans le dictionnaire de changement qui est livré à l'observateur.

Est-ce possible?

Répondre

2

Ceci est facilement résoluble en mettant à jour les objets du modèle d'une manière plus granulaire; Cependant, les collections intégrées ne génèrent pas de notifications KVO lorsque leur contenu est modifié et nécessitent un certain support manuel.

Si vous souhaitez générer des notifications sur les modifications apportées au tableau, utilisez willChange:valuesAtIndexes:forKey: et didChange:valuesAtIndexes:forKey: chaque fois qu'il est modifié. Lorsque ces méthodes sont utilisées, le dictionnaire de modification contiendra une entrée pour NSKeyValueChangeIndexesKey, qui reflète les index d'insertion, de suppression ou de remplacement.

Si vous souhaitez générer des notifications sur les modifications au dictionnaire, vous pouvez appeler sur le dictionnaire lui-même willChangeValueForKey: et didChangeValueForKey:, comme ceci:

- (void)addContent:(id)content { 
    NSString *key = [content name]; 

    [self.contentsByName willChangeValueForKey:key]; 
    [self.contentsByName setValue:content forKey:key]; 
    [self.contentsByName didChangeValueForKey:key]; 
} 

Tout observateur peut également utiliser NSKeyValueObservingOptionNew ou NSKeyValueObservingOptionOld pour recevoir le nouveau ou anciennes valeurs, respectivement.