我正在尝试观察NSManagedObject
上的各个NSManagedObjectContextWillSaveNotification
更改:
- (void)managedObjectContextWillSave:(NSNotification *)notification
{
for (NSManagedObject * object in self.mutableObservedManagedObjects)
{
if (object.hasChanges)
{
[self managedObjectWasUpdated:object];
}
}
}
问题是当hasChanges
为空时object.changedValues
为真,因此错误地(?)触发managedObjectWasUpdated:
。
我试图理解为什么会这样,如果我在调用object.changedValues.count
之前最好检查一下managedObjectWasUpdated:
。
isInserted
和isDeleted
都是假的。
答案 0 :(得分:7)
根据我的经验,如果实体已存在,则加载它然后将值设置为等于其先前值的属性,然后该记录将标记为已更新,hasChanges
将返回{ {1}},YES
将为空。保存上下文时,更新的内容是名为Z_OPT的特殊Core Data列,它指的是实体更新的次数。对于这些情况,您可以在保存之前执行以下操作:
changedValues
为了甚至不更新Z_OPT值。
答案 1 :(得分:4)
我遇到了同样的问题。我没有得到标志,而是检查了changeValues()是否为空。
对于Swift:
if !managedObject.changedValues().isEmpty {
// Has some changed values
}
答案 2 :(得分:3)
根据文档,如果已插入接收器,已删除或未保存更改,hasChanges
将返回YES,否则为NO。
在您的情况下,您可以检查isInserted
,isUpdated
,isDeleted
标记以查找您的托管对象发生了什么。 changedValues
仅显示自上次提取或保存接收器以来已更改的属性。
答案 3 :(得分:1)
在iOS 7中,您还可以使用hasPersistentChangedValues而不是changedValues。我认为这表现得更好。