gpt4 book ai didi

ios - 为什么 KVO 在新旧值相同时发送更改通知?

转载 作者:技术小花猫 更新时间:2023-10-29 11:17:59 25 4
gpt4 key购买 nike

我有一个名为 Event 的实体,它是 NSManagedObject 的子类。我还为 KVO 更改通知注册了该实体的一些建模属性:

[self.event addObserver:self
forKeyPath:@"numGuests"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:&numGuestsContext];

[self.event addObserver:self
forKeyPath:@"checkedIn"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:&checkedInContext];

[self.event addObserver:self
forKeyPath:@"seatedCount"
options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
context:&seatedContext];

但是,即使更改字典中的 NSKeyValueChangeOldKey 和 NSKeyValueChangeNewKey 的值相等,observeValueForKeyPath 方法通知似乎也被触发了???

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSNumber *oldValue = [change valueForKey:NSKeyValueChangeOldKey];
NSNumber *newValue = [change valueForKey:NSKeyValueChangeNewKey];

if ([oldValue isEqualToNumber:newValue])
{
return;
}

现在我只是做了一个快速的健全性检查,看看它们是否相等,但我想了解为什么这个通知一开始就被解雇了?

更新:@jszumski 在评论中提到,这很可能发生,因为尽管逻辑上相等,但对象不同。事件实体对象始终具有相同的地址,但是我正在观察的对象(实体中的一个属性)不断更改地址,尽管我不确定为什么?

我想知道在 bg 查询线程中访问这个值是否会导致 Core Data 在实体中创建具有相同值的新内部对象?

最佳答案

简单地说,您假设了 NSKeyValueObservingOptions 的功能.它们并不像您期望的那样工作。您发送的标志仅决定更改字典的内容。每当调用 setter 时,观察者总是被触发。

此外,当您发送标记oldnew 时,这实际上只是在说“我想要旧值和新值。我不在乎是否它们是否相等”。

请阅读引用以了解更多信息:

NSKeyValueObservingOptions

These constants are passed to addObserver:forKeyPath:options:context: and determine the values that are returned as part of the change dictionary passed to an observeValueForKeyPath:ofObject:change:context:. You can pass 0 if you require no change dictionary values.

关于ios - 为什么 KVO 在新旧值相同时发送更改通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17684560/

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