【发布时间】:2016-02-25 07:53:25
【问题描述】:
[managedObjectContext refreshAllObjects]
实际上,我在保存上下文的某个时候遇到随机错误,当我在错误后调用[managedObjectContext refreshAllObjects] 时,它允许我保存。
谁能指导我这个方法。
【问题讨论】:
标签: ios nsmanagedobject nsmanagedobjectcontext
[managedObjectContext refreshAllObjects]
实际上,我在保存上下文的某个时候遇到随机错误,当我在错误后调用[managedObjectContext refreshAllObjects] 时,它允许我保存。
谁能指导我这个方法。
【问题讨论】:
标签: ios nsmanagedobject nsmanagedobjectcontext
调用 refreshAllObjects 对上下文中的所有对象调用 refreshObject:mergeChanges。您可以在此处查看有关 refreshObject:mergeChanges 的文档:
您的持久存储可能已被其他上下文修改,因此当您尝试从当前上下文保存到它时会出现错误。如果您先刷新当前上下文,那么任何修改过的数据都将被合并,您现在可以保存而不会发生冲突。
【讨论】:
refreshAllObjects 可以暂时解决我的问题。我知道我必须寻找实际原因,但目前这不会对数据造成任何严重问题(比如数据未保存在核心数据中)?
当您在上下文保存期间遇到错误时,您可能在上下文和持久存储之间存在合并冲突。如果您在通过refreshAllObjects() 保存之前更新您的上下文,则会为上下文中的每个对象调用refresh(_ object:mergeChanges:),其中mergeChanges: 是true。这意味着在更新持久存储中更改的属性时,会保留上下文中更改的属性。这正是自动完成的,如果您将context.mergePolicy 设置为NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType,请参阅文档here 和here。
但这可能不是你想要的。考虑一种情况,属性为updatedAt 的实体可以在本地和远程更改,并且要求不能混合单个属性,而只保留最后更新的完整实体。在这种情况下,预定义的合并策略都不适用,并且必须设置一个自定义合并策略来检查updatedAt 属性。如何做到这一点在here 进行了描述。
【讨论】: