任何人都可以在 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”的参考吗的主要内容,如果未能解决你的问题,请参考以下文章

通过电子邮件发送 coreData

任何人都可以在 Scala 中分享 Flink Kafka 示例吗?

任何人都可以在 Glide 上下文中解决这个错误[关闭]

在 iOS 中,是不是可以在到达特定位置(或区域)时获得警报。 ?如果是,任何人都可以提供同样的例子吗?

任何人都可以在 MySQL 中调整给定的查询吗

在本地主机上上传文件,以便网络中的任何人都可以访问[重复]