Есть ли способ узнать, когда KVO начинается / заканчивается для определенного значения? - PullRequest
3 голосов
/ 27 ноября 2011

У меня есть некоторые значения, которые вычисляются по коллекциям и могут отображаться или не отображаться (и, следовательно, могут иметь или не иметь наблюдателя) в любой момент времени.Я бы предпочел не отслеживать всех членов коллекции, если никто не наблюдает за моими вычисленными значениями.

Могу ли я узнать, наблюдает ли кто-нибудь в данный момент за значением, и могу ли я узнать, когда они начнут наблюдать?

Я знаю, для данного объекта foo Я могу использовать [foo observationInfo], чтобы получить список наблюдателей с ключевыми путями, зарегистрированными с корнем в foo, , но , который автоматически не получает все пути кfoo (фактически он регистрируется только для того, чтобы наблюдать собственный ключ foo).

Ответы [ 2 ]

3 голосов
/ 27 ноября 2011

Это не очень хорошая идея с точки зрения дизайна. Если вы действительно настаиваете на том, чтобы не обновлять содержимое, когда оно никому не нужно (что может быть законным случаем, например, если обновления стоят дорого), вы можете ввести методы для запуска / остановки обновлений:

- (void) beginUpdatingContents;
- (void) endUpdatingContents;

Они должны быть привязаны к счетчику внутри класса, и если счетчик> 0, вы знаете, что кто-то хочет обновлять содержимое. Это решение явное и поэтому лучше, чем безмолвная магия с КВО.

2 голосов
/ 27 ноября 2011

Если вам нужно больше магии, как насчет переопределения addObserver:forKeyPath:options:context: и removeObserver:forKeyPath: и отслеживания того, что все еще наблюдает за вами?

Способ, которым я на самом деле делал это в прошлом, заключается в создании объектов-оберток (Я назвал их привязками), которые настраивают KVO и также регистрируют себя с целью.Таким образом, пользователь будет звонить MyBinding *binding = [targetObject bindKeyPath:@"foo" ...], а затем [binding detach].Затем у вас есть привязка, использующая KVO под капотом, и ведите список самих себя, чтобы вы знали, когда она пуста.

...