Мой обходной путь:
Первоначально я работал над этой проблемой, привязываясь прямо к значению, которое я хотел отследить. В приведенном примере это выглядело бы как arrangedObjects.owner.stuff
.
Мое решение:
Позже я снова посетил код и обнаружил, что то, что я имел, было по существу правильным . Идея заключалась в том, чтобы инкапсулировать внутреннюю работу иерархии объектов (что невозможно, если вы связываете весь путь, как мой обходной путь выше). В этом вопросе я упростил задачу до иерархии с двумя уровнями: MyClass -> Person. Мой код на самом деле включает в себя больше уровней и отношение ко многим. Один из элементов в иерархии неправильно наблюдал за своими дочерними элементами.
Денис предложил мне взглянуть на -automaticallyNotifiesObserversForKey:
, и я сделал. Насколько я понимаю, вы хотите, чтобы метод возвращал NO
в случае, если вы хотите отправить уведомление вручную в методе установки свойства. В противном случае ваши уведомления конфликтуют с автоматическими.
- (void)setHasSomething:(BOOL)newVal
{
[self willChangeValueForKey:@"hasSomething"];
// ...
[self didChangeValueForKey:@"hasSomething"];
}
Так как нет метода установки для свойства только для чтения, наличие его не решило мою проблему.
Извлеченные уроки: 1) Правильно наблюдайте за своими детьми; 2) Не упрощайте проблему, обращаясь за помощью.