КВО на NSCountingSet?
Я хотел бы контролировать NSCountingSet, чтобы увидеть, если его содержимое меняется. Настройка KVO, похоже, компилируется, но она не запускается. Первый вопрос: можно ли наблюдать за сетом? Если так, то что-то не так с этим сообщением?
[subViewA addObserver:subViewB forKeyPath:@"countedSet" options:0 context:NULL];
Я действительно просто пытаюсь контролировать количество (количество объектов в) набора, если это помогает.
Изменить - вот наблюдатель (subViewB):
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
if ([keyPath isEqual:@"countedSet"]) {
NSLog(@"Set has changed");
}
}
Edit2 - переместил сообщение addObserver из subView в viewController. Таким образом, я пытаюсь получить один subView для наблюдения NSCededSet в другом из subViews viewController. Ключевой путь "относительно приемника" - который я предполагаю, чтобы быть subViewA.
3 ответа
Разговор непосредственно с заданным объектом не выдает уведомления об изменении KVO. Необходимо внести изменения в установленное значение свойства в соответствии с KVC. Есть два способа:
- Отправить владельцу
mutableSetValueForKey:
сообщение. Это даст вам объект поддельного набора, который оборачивает свойство и размещает уведомления KVO вокруг каждого изменения, которое вы вносите в него. - Реализуйте методы доступа set для свойства и используйте их везде. Реализация каждого метода напрямую связывается с базовым объектом множества; весь код, который не входит ни в один из этих методов, должен пройти через них. Так, например, чтобы добавить объект, вы не должны использовать
[myCountedSet addObject:foo]
(кроме как вaddCountedSetObject:
); ты должен использовать[self addCountedSetObject:foo]
вместо.
Я рекомендую № 2. Это может звучать как большая работа, но это не так много, и это делает для действительно хорошего кода.
Более подробная информация содержится в Руководстве по реализации объекта модели и в Руководстве по программированию базовых данных (хотя это не относится к базовым данным).
Определенно существуют методы ручного изменения KVO для неупорядоченных отношений "многие".
Разве вы не хотите устанавливать ненулевые параметры? Например, NSKeyValueObservingOptionNew
Также KVO Helper Майка Эша очень хорош.
Из документов NSSet на addObserver:
Объекты NSSet не наблюдаемы, поэтому этот метод вызывает исключение при вызове объекта NSSet. Вместо того, чтобы наблюдать за множеством, наблюдайте неупорядоченное отношение ко многим, для которого множество является набором связанных объектов.
Некоторые вещи, чтобы проверить:
- Является
myController
не-nil
? Если этоnil
,addObserver::::
сообщение просто падает на пол молча. - Ваш метод вызывается вообще? Возможно, это называется, но не с тем ключом, который вы ожидаете. (Я бы тоже этого не ожидал, но это стоит проверить.)