我有一个实体,它是 NSManagedObject 的子类,称为 Event。我还为 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 在实体中创建具有相同值的新内部对象?