在保留 NSManagedObject 的同时保持它是最新的

Posted

技术标签:

【中文标题】在保留 NSManagedObject 的同时保持它是最新的【英文标题】:Keeping a NSManagedObject up to date while retaining it 【发布时间】:2013-09-30 20:30:13 【问题描述】:

我有一个 NSManagedObject 实例,它代表我的应用程序中的用户。我保留了这个实例并在视图控制器之间传递它以供接口参考。用户实例所属的托管对象上下文 (MOC) 是主队列 MOC,它是直接保存到持久存储的私有队列 MOC 的子队列。

我的核心数据持久存储在单独的后台队列中在后台更新。这些更新被保存到私有队列 MOC,然后提交到主私有队列 MOC,随后保存到持久存储中。

我的问题是,如何确保用户 NSManagedObject 实例保持最新?我知道refreshObject:mergeChanges: 的存在,但是,设置一个NSManagedObjectContextDidSaveNotification 观察者来简单地保持对象实例是最新的似乎很复杂。在尝试使多个 NSManagedObject 实例保持最新时,我可以看到这种方法变得不守规矩。

【问题讨论】:

【参考方案1】:

根据经验,您最好的选择是不要尝试使其保持最新状态。您需要使用实现 NSManagedObjectContextDidSaveNotification 以使您的 context 保持最新——你无法解决这个问题——但要获得一个有效的对象,你需要在每次更新。最简单的方法是依赖于应用程序,但我经常使用唯一的、服务器生成的 ID 来传递对象,然后在我需要使用它们时使用它们从数据库中取出它们。 (唯一 ID 是必要的,因为我通常使用使用它们的 API,因此您的结果会有所不同)该技术可能起作用或可能不起作用的唯一地方是您在本地生成数据的地方,并且还没有(还) 将其上传到数据库,并在其中获得永久 ID。我通常对它们进行特殊处理,并有一个与“真实”ID分开的设备ID,只是为了跟踪它们直到他们获得真实ID。任何没有“真实”ID 的东西都是我的逻辑所意识到的需要持久保存到服务器的东西,所以这对我有用。

【讨论】:

当您说“唯一 ID”时,您的意思是 NSManagedObject#objectID?或者您是否在您的实体中插入一个额外的、特定于服务器的 ID? @LeviMcCallum 我唯一一次使用 objectID 的时候,如果我想在两个不同的 MOC 之间转移;由于您无法自行处理托管对象,因此您必须通过 objectID 获取一个新对象。

以上是关于在保留 NSManagedObject 的同时保持它是最新的的主要内容,如果未能解决你的问题,请参考以下文章

保持 CoreData NSManagedObject 新鲜

将 NSManagedObject 保持在 CoreData NSManagedObjectContext 块之外

即使删除后,已删除的 NSManagedObject 仍保留在内存中

保存上下文不会保留更新的 NSManagedObject

NSManagedObject 中未保存的 NSSet 成员是不是会在保存时保留已删除的成员?

NSManagedObject;保留或加载到自定义 NSObject 中?