gpt4 book ai didi

objective-c - KVO - 如何检查对象是否是观察者?

转载 作者:IT老高 更新时间:2023-10-28 11:45:03 26 4
gpt4 key购买 nike

当使用 addObserver:forKeyPath:options:context: 观察对象上的值时,最终你会想要在该对象上调用 removeObserver:forKeyPath: 来清理后来起来。不过,在这样做之前,是否可以检查一个对象是否真的在观察该属性?

我试图在我的代码中确保一个对象仅在需要时才移除观察者,但在某些情况下,观察者可能会尝试将自身移除两次。我正在努力防止这种情况发生,但以防万一,我只是想弄清楚是否有办法首先检查我的代码是否真的是某事的观察者。

最佳答案

[...] is it possible to check if an object actually is observing that property?

没有。在处理 KVO 时,您应该始终牢记以下模型:

在建立观察时,您有责任删除确切的观察。观察是由其上下文识别的——因此,上下文必须是唯一的。接收通知时(以及在 Lion 中移除观察者时),您应该始终测试上下文,而不是路径。

处理被观察对象的最佳实践是,在被观察对象的setter中移除并建立观察:

static int fooObservanceContext;

- (void)setFoo:(Foo *)foo
{
[_foo removeObserver:self forKeyPath:@"bar" context:&fooObservanceContext];

_foo = foo; // or whatever ownership handling is needed.

[foo addObserver:self forKeyPath:@"bar" options:0 context:&fooObservanceContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if (context == &fooObservanceContext) {
// handle change
} else {
// not my observer callback
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
}
}

- (void)dealloc
{
self.foo = nil; // removes observer
}

使用 KVO 时,您必须确保只要观察到位,观察者和被观察者两个对象都处于事件状态。

添加观察时,您必须在此与仅删除相同观察的情况下进行平衡。不要假设,您是唯一使用 KVO 的人。框架类可能会出于自己的目的使用 KVO,因此请始终检查回调中的上下文。

我想指出的最后一个问题:观察到的属性必须符合 KVO。 You can't just observe anything .

关于objective-c - KVO - 如何检查对象是否是观察者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9231896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com