Подтвердить что ты не робот

Получение 2 уведомлений KVO для одного изменения KVC

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

У меня есть "контроллер привязок", который регистрирует уведомления KVO на нескольких ключах на объекте (с помощью addObserver: forKeyPath: options: context:), и я получаю уведомления. Однако я получаю два уведомления для каждого изменения. У меня есть идея обходного пути, но я бы предпочел выяснить, почему это происходит и исправить его.

Есть ли у кого-нибудь идеи, почему это может произойти? Я уверен, что я зарегистрировал каждое уведомление только один раз, и отмена регистрации за один раз заставляет оба уведомления останавливаться.

Спасибо.

Edit:

У меня есть запрос на некоторый код, поэтому я поместил его. Это немного грубо на данный момент, это по сути все еще доказательство концепции, так что несите меня.

Это одно из свойств, которые я наблюдаю (я знаю, это немного странно, но этот класс по существу предоставляет некоторые свойства объекта NSManagedObject как свойства самого себя):

- (void)setName:(NSString *)name
{
    [self willChangeValueForKey:@"name"];
    [contact setFirstName:name];
    [self didChangeValueForKey:@"name"];
}

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

[viewModel addObserver:self
            forKeyPath:@"name"
               options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial)
               context:viewController];

Любые вызовы после этого, которые изменяют это свойство, например:

viewModel.name = @"Joe";
[viewModel setName: @"Joe"];
[viewModel setValue: @"Joe" forKey: @"name"];

вызовет метод:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

для вызова дважды, с одинаковыми аргументами каждый раз.

4b9b3361

Ответ 1

Вы делаете это:

- (void)setName:(NSString *)name
{
    [self willChangeValueForKey:@"name"];
    [contact setFirstName:name];
    [self didChangeValueForKey:@"name"];
}

Но (по звукам) из подкласса non NSManagedObject. Это означает, что Cocoa будет пытаться автоматически отправлять уведомления KVO. Вы дополняете это, отправляя свой собственный тоже. Решения:

  • Заменить +automaticallyNotifiesObserversForKey: для возврата NO
  • Измените свой метод на:

    - (void)setName:(NSString *)name { [contact setFirstName:name]; }

Ответ 2

Возможно, поместите NSLog в ваш вызов addObserver, чтобы увидеть, добавляете ли вы двух наблюдателей.