2016-02-25 5 views
0

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

Предположим, у меня есть NSMutableArray, я KVObserving. Он содержит кучу объекта Employee. Если я полностью назначу массив, то, без сомнения, я буду наблюдать изменение. Однако, что, если я изменю одну из ссылок/ценностей/объектов объекта Employee в массиве, например employee.salary.

Я предполагаю, что нет уведомления KVO, здесь правильно?

И если вы когда-либо хотели чего-то подобного, как бы это было достигнуто?

+0

Разве это не то, что 'addObserver: toObjectsAtIndexes: forKeyPath: options: context' для? Но, разумеется, поскольку сам массив является изменчивым, поддержание этого будет грозным предложением. – matt

ответ

0

Попробуйте это:

[[employee mutableArrayValueForKey:@"salary"] addObject:...] 
1

Один быстрый придираться: вы не можете быть ключ-значение наблюдения в NSMutableArray. Это не то, что делает KVO. То, что вы делаете, является ключевым значением, наблюдающим некоторое свойство (например, «служащие») какого-либо объекта. Это свойство может быть напечатано как NSMutableArray (хотя это ужасная идея) или просто подкреплено NSMutableArray. Но вы не наблюдаете массив. Вы наблюдаете объект за изменения его свойства employees.

Ключевое значение, наблюдающее свойство коллекции не Соблюдать свойства объектов в коллекции. В общем, нет возможности наблюдать все свойства, оптовые, любые объекты.

Если вы хотите наблюдать некоторые специфические свойства или свойства объектов в коллекции, вы должны:

  1. Объединить все мутации этой коллекции для отдельных методов. Вы уже должны были сделать это, чтобы сделать свой employees свойство KVO-совместимым. В частности, я рекомендую вам внедрить индексированные ассемблеры, мутирующие коллекции.
  2. В этих методах используйте -addObserver:toObjectsAtIndexes:forKeyPath:options:context: и -removeObserver:fromObjectsAtIndexes:forKeyPath:context:, чтобы начать и прекратить наблюдение за некоторыми ключевыми дорожками элементов, которые добавляются или удаляются из коллекции. Вам нужно сделать это в настройщике (-setEmployees:) для свойства employees тоже (прекратите наблюдать все элементы старого массива, замените его новым массивом, начните наблюдать все элементы нового массива).
  3. Не забудьте прекратить наблюдать элементы до того, как массив будет выпущен, например, в -dealloc.
+0

Хорошо nitpick ^^ –