КВО на NSCountingSet? - PullRequest
       21

КВО на NSCountingSet?

4 голосов
/ 23 октября 2009

Я хотел бы отслеживать набор 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 из вспомогательного представления в viewController. Таким образом, я пытаюсь получить один subView для наблюдения NSCededSet в другом из subViews viewController. Путь к ключу «относительно получателя», который я предполагаю как subViewA.

Ответы [ 3 ]

7 голосов
/ 23 октября 2009

Разговор непосредственно с заданным объектом не выдает уведомления об изменении KVO. Необходимо внести изменения в установленное значение свойства в соответствии с KVC. Есть два способа:

  1. Отправить владельцу недвижимости сообщение mutableSetValueForKey:. Это даст вам объект поддельного набора, который оборачивает свойство и размещает уведомления KVO вокруг каждого изменения, которое вы вносите в него.
  2. Реализуйте методы доступа set для свойства и используйте их везде. Реализация каждого метода напрямую связывается с базовым объектом множества; весь код, который не входит ни в один из этих методов, должен пройти через них. Так, например, чтобы добавить объект, вы не должны использовать [myCountedSet addObject:foo] (за исключением addCountedSetObject:); Вы должны использовать [self addCountedSetObject:foo] вместо.

Я рекомендую # 2. Это может звучать как дополнительная работа, но это не так много, и это делает для действительно хорошего кода.

Подробнее в Руководстве по реализации объекта модели и в Руководстве по программированию базовых данных (хотя это не относится к базовым данным).

3 голосов
/ 23 октября 2009

Определенно существуют методы ручного изменения KVO для неупорядоченных отношений ко многим.

Разве вы не хотите установить параметры на ненулевое значение? Например, NSKeyValueObservingOptionNew

Также у Майка Эша KVO Helper довольно отлично.

Из документов NSSet на addObserver:

Объекты NSSet не наблюдаемы, поэтому этот метод вызывает исключение, когда вызывается для объекта NSSet. Вместо наблюдая за сетом, наблюдайте за неупорядоченным отношения ко многим, для которых множество это коллекция связанных объектов.

0 голосов
/ 23 октября 2009

Что нужно проверить:

  1. Является ли myController не- nil? Если это nil, сообщение addObserver:::: просто тихо падает на пол.
  2. Ваш метод вызывается вообще? Возможно, это называется, но не с тем ключом, который вы ожидаете. (Я бы тоже этого не ожидал, но это стоит проверить.)
...