Можно ли изменить словарь изменений при ручном запуске события KVO? - PullRequest
0 голосов
/ 17 сентября 2010

У меня есть модель данных, состоящая в основном из NSMutableArray 'contents' и NSMutableDictionary 'contentsByName'. У меня есть объекты ViewController, которые я хочу наблюдать за изменениями в модели данных.

У меня есть свойство "count" в модели, которое возвращает размер содержимого "массива", и я могу вызвать наблюдение за изменением KVO с помощью willChange: и didChange :. Все идет нормально. Однако контроллеры представления теперь знают, что модель изменилась, но не знают, что к ней было добавлено. В идеале мне нужно поместить дополнительную информацию в словарь изменений, который доставляется наблюдателю.

Это вообще возможно?

1 Ответ

2 голосов
/ 03 января 2011

Это легко решить, обновив объекты модели более детально;однако встроенные коллекции не генерируют уведомления KVO при изменении их содержимого и требуют некоторой поддержки вручную.

Если вы хотите создавать уведомления об изменениях в массиве, используйте willChange: valuesAtIndexes: forKey: и didChange: valuesAtIndexes: forKey: всякий раз, когда он изменяется.При использовании этих методов словарь изменений будет содержать запись для NSKeyValueChangeIndexesKey, которая отражает индексы вставки, удаления или замены.

Если вы хотите создавать уведомления об изменениях в словаре, вы можетевызовите willChangeValueForKey: и didChangeValueForKey: для самого словаря, например:

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

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

Любой наблюдатель может также использовать NSKeyValueObservingOptionNew или NSKeyValueObservingOptionOld для получения новых или старых значений соответственно.

...