【发布时间】:2013-07-16 18:45:04
【问题描述】:
我有一个实体,它是 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 在 cmets 中提到这很可能是因为对象不同但逻辑上相等。事件实体对象始终具有相同的地址,但是我正在观察的对象(实体中的一个属性)不断更改地址,尽管我不确定为什么?
我想知道在 bg 查询线程中访问这个值是否会导致 Core Data 在实体中创建具有相同值的新内部对象?
【问题讨论】:
-
oldValue和newValue是逻辑上相等的不同对象吗? -
我不明白?该方法被触发是因为您更新了
NSManagedObject子类中的某些属性(您正在观察)。无论新旧值是否相同,它都会被触发。 -
@jszumski 看起来可能是这种情况。事件实体对象始终具有相同的地址,但是我正在观察的对象(实体中的一个属性)不断更改地址,尽管我不确定为什么? Core Data 是否会在获取时在实体内创建新对象?
-
这个“问题”得到了我预期的“答案” SWEEETTT!!!
标签: ios core-data key-value-observing