如何通过KVO通知传输数据?

时间:2011-06-17 02:01:58

标签: iphone objective-c notifications

因此,当类实例值发生变化时,我能够通过KVO通知成功通知我的另一类,但我不知道如何在两个对象之间传输数据。我知道可以通过context:参数执行此类操作,但是Apple's documentation无法指示如何执行此操作。

我知道您将指向对象的指针作为addObserver:forKeyPath:options:context:消息中的上下文参数,但是被观察的对象如何“看到”指向的对象以便它可以进行修改相应?

谢谢!

2 个答案:

答案 0 :(得分:1)

上下文参数不是数据传输设备,它只是帮助观察类区分不同的观察结果。我不确定你是否理解KVO。当您想要了解某个属性的更新时,可以使用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];

答案 1 :(得分:0)

所以我这样工作......

我有一个对象(obj A)需要观察另一个对象(obj B)并实现以下功能:observeValueForKeyPath:ofObject:change:context:

Obj B在其init函数中调用以下内容:

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

当然观察者类不需要是单例类,但当然它非常方便。我将被观察的对象作为上下文传递,并允许obj A访问observeValueForKeyPath:ofObject:change:context:函数中obj B的所有ivars。

正如我发现的那样,不同的后台线程不会用于KVO通知,所以我恢复使用协议来传输信息,因为它们都是相同的。

不推荐这种形式的数据传输,但我想指出它确实可行。