当changedValues为空时,NSManagedObject的hasChanges为true

时间:2014-10-10 07:13:12

标签: ios macos core-data nsnotificationcenter

我正在尝试观察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:


isInsertedisDeleted都是假的。

4 个答案:

答案 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。

在您的情况下,您可以检查isInsertedisUpdatedisDeleted标记以查找您的托管对象发生了什么。 changedValues仅显示自上次提取或保存接收器以来已更改的属性。

答案 3 :(得分:1)

在iOS 7中,您还可以使用hasPersistentChangedValues而不是changedValues。我认为这表现得更好。