当changedValues为空时,NSManagedObject的hasChanges为true

Riv*_*era 12 macos core-data nsnotificationcenter ios

我试图观察个别NSManagedObject变化NSManagedObjectContextWillSaveNotification:

- (void)managedObjectContextWillSave:(NSNotification *)notification
{
    for (NSManagedObject * object in self.mutableObservedManagedObjects)
    {
        if (object.hasChanges)
        {
            [self managedObjectWasUpdated:object];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是hasChanges当它object.changedValues是空的时候是真的,因此错误地(?)触发managedObjectWasUpdated:.

我试图理解为什么会这样,如果我object.changedValues.count在打电话之前应该更好地检查managedObjectWasUpdated:.


isInserted并且isDeleted都是假的.

Gia*_*ino 7

根据我的经验,如果实体已经存在,则加载它然后将值设置为等于其先前值的属性,然后记录将被标记为已更新,hasChanges将返回YES,并且changedValues将为空.保存上下文时,更新的内容是名为Z_OPT的特殊Core Data列,它指的是实体更新的次数.对于这些情况,您可以在保存之前执行以下操作:

for (NSManagedObject *managedObject in context.updatedObjects.objectEnumerator) {
    if (!managedObject.changedValues.count) {
        [context refreshObject:managedObject mergeChanges:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

为了甚至不更新Z_OPT值.

  • 我相信这是最准确的答案。`hasChanges` 基于 Core Data 知道的_一切_(包括 Z_OPT)。`changedValues()` 是报告实体的不同字段。在大多数情况下,应用程序可能更关心 `changedValues().isEmpty`。 (2认同)
  • 除了检查“changedValues.count”,您还可以使用“NSManagedObject”上引入的新属性:“var hasPersistentChangedValues: Bool” (2认同)

chr*_*nse 5

我遇到了同样的问题。我没有获取标志,而是检查了 changedValues() 是否为空。

对于斯威夫特:

if !managedObject.changedValues().isEmpty {
    // Has some changed values
}
Run Code Online (Sandbox Code Playgroud)


Rad*_*lad 5

从 iOS 7 开始,您还可以使用 hasPersistentChangedValues 而不是 changedValues。我认为这表现更好。

  • 事实上`hasPersistentChangedValues`是最好的选择。根据头文件的注释,如果任何持久属性没有将 `isEqual` 与其上次保存的状态进行比较,`hasPersistentChangedValues` 将返回 YES。关系错误不会被不必要地解雇。这与现有的 `-hasChanges` 方法不同,它是一个简单的脏标志,还包括瞬态属性。 (3认同)