任何人都可以在 NSManagedObjectContext 中给我一些关于这个方法“refreshAllObjects”的参考吗
Posted
技术标签:
【中文标题】任何人都可以在 NSManagedObjectContext 中给我一些关于这个方法“refreshAllObjects”的参考吗【英文标题】:Can anyone give me some reference for this method "refreshAllObjects" in NSManagedObjectContext 【发布时间】:2016-02-25 07:53:25 【问题描述】:[managedObjectContext refreshAllObjects]
实际上,我在保存上下文的某个时候遇到随机错误,当我在错误后调用[managedObjectContext refreshAllObjects]
时,它允许我保存。
谁能指导我这个方法。
【问题讨论】:
【参考方案1】:调用 refreshAllObjects 对上下文中的所有对象调用 refreshObject:mergeChanges。您可以在此处查看有关 refreshObject:mergeChanges 的文档:
https://developer.apple.com/library/ios/documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObjectContext_Class/#//apple_ref/occ/instm/NSManagedObjectContext/refreshObject:mergeChanges:
您的持久存储可能已被其他上下文修改,因此当您尝试从当前上下文保存到它时会出现错误。如果您先刷新当前上下文,那么任何修改过的数据都将被合并,您现在可以保存而不会发生冲突。
【讨论】:
感谢您的回复,所以这意味着如果出现错误调用refreshAllObjects
可以暂时解决我的问题。我知道我必须寻找实际原因,但目前这不会对数据造成任何严重问题(比如数据未保存在核心数据中)?
理想情况下,您应该在开始更改要保存的数据之前调用 refreshAllObjects。如果您遇到的错误是由于冲突引起的,并且持久存储中更改的数据与您尝试修改和保存的数据发生冲突,您最终可能会得到意想不到的结果。如果您进行刷新,然后修改您想要的数据,然后保存,您的所有更改都会正确保存。【参考方案2】:
当您在上下文保存期间遇到错误时,您可能在上下文和持久存储之间存在合并冲突。如果您在通过refreshAllObjects()
保存之前更新您的上下文,则会为上下文中的每个对象调用refresh(_ object:mergeChanges:)
,其中mergeChanges
: 是true
。这意味着在更新持久存储中更改的属性时,会保留上下文中更改的属性。这正是自动完成的,如果您将context.mergePolicy
设置为NSMergePolicyType.mergeByPropertyObjectTrumpMergePolicyType
,请参阅文档here 和here。
但这可能不是你想要的。考虑一种情况,属性为updatedAt
的实体可以在本地和远程更改,并且要求不能混合单个属性,而只保留最后更新的完整实体。在这种情况下,预定义的合并策略都不适用,并且必须设置一个自定义合并策略来检查updatedAt
属性。如何做到这一点在here 进行了描述。
【讨论】:
以上是关于任何人都可以在 NSManagedObjectContext 中给我一些关于这个方法“refreshAllObjects”的参考吗的主要内容,如果未能解决你的问题,请参考以下文章
任何人都可以在 Scala 中分享 Flink Kafka 示例吗?