Как передавать данные через уведомления KVO? - PullRequest
3 голосов
/ 17 июня 2011

, поэтому я могу успешно уведомить другой мой класс через KVO-уведомление об изменении значения экземпляра класса, но я понятия не имею, как мне поступить при передаче данных между двумя объектами. Я знаю, что это можно сделать с помощью параметра context:, однако В документации Apple не указано, как это сделать.

Мне известно, что вы помещаете указатель на объект в качестве параметра контекста в сообщении addObserver:forKeyPath:options:context:, но как наблюдаемый объект "видит" этот объект, на который он указывает, чтобы он мог соответственно вносить изменения?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июня 2011

Аргумент контекста не предназначен для передачи данных, он просто помогает классу наблюдателей отличать разные наблюдения друг от друга.Я не уверен, правильно ли ты понимаешь КВО.KVO используется, когда вы хотите узнать об обновлениях определенного свойства.Получив уведомление, вы обычно делаете что-то со старым / новым значением свойства:

- (void) observeValueForKeyPath: (NSString*) keyPath ofObject: (id) sender
    change: (NSDictionary*) change context: (void*) context
{
    id newValue = [change objectForKey:NSKeyValueChangeNewKey];
    NSLog(@"New property value: %@.", newValue);
}

В этом случае не имеет особого смысла говорить о «передаче данных» между двумя сторонами.Если вы хотите получить некоторые дополнительные данные в дополнение к изменениям свойств, вы можете легко представить эти данные как свойство наблюдаемого класса.Или забудьте о KVO и вызовите обычный NSNotification со всеми необходимыми данными, передаваемыми в качестве объекта информации пользователя:

NSDictionary *info = [NSDictionary dictionaryWithObjectsAndKeys:
    foo, @"foo", bar, @"bar", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"Foo"
    object:self userInfo:info];
0 голосов
/ 21 июня 2011

Итак, у меня все работает так ...

У меня есть объект (объект A), который должен наблюдать другой объект (объект B) и реализующий следующую функцию: observeValueForKeyPath:ofObject:change:context:

Obj B вызывает в своей функции init следующее:

[self addObserver:[<some singleton class> sharedManager] forKeyPath:@"someVar" options:(NSKeyValueObservingOptionNew) context:self];

Конечно, класс-наблюдатель не обязательно должен быть одноэлементным, но, конечно, это очень удобно.Я передал объект, который рассматривается как контекст, и это позволило obj A получить доступ ко всем ivars для obj B в функции observeValueForKeyPath:ofObject:change:context:.

Как я обнаружил, разные фоновые потоки не используются для уведомлений KVO,поэтому я возвращаюсь к использованию протоколов для передачи информации, так как они работают одинаково.

Эта форма передачи данных не рекомендуется, но я просто хотела отметить, что она действительно возможна.

...