应更新数据时,NSManagedObject 的删除/插入与更新

Posted

技术标签:

【中文标题】应更新数据时,NSManagedObject 的删除/插入与更新【英文标题】:Delete/Insert versus Update for NSManagedObjects when data should be updated 【发布时间】:2013-09-05 10:34:16 【问题描述】:

我正在尝试解决在这种情况下出现的问题:

    用户可以从外部源发起数据加载,加载数据时,通过CoreData保存。然后它会显示在一些视图中,并且一些其他类得到了对 NSManagedObjects 的引用。 数据加载可由其他条件启动(例如,当应用程序从后台恢复时)。接收到新的外部数据,dataController 删除以前的数据并创建新数据。这就是问题所在。 我想通知所有数据消费者类他们应该加载新实例(向他们发送对已删除对象的引用,以便他们可以将引用与他们拥有的引用进行比较,并确定他们是否要求新的数据版本)。但是删除consumer-class后引用了fault没有属性,它的ObjectID就没有用了(因为保存了新的实例),我不知道怎么加载它的新版本。

我可以实现一些 NSManagedObject 包装器:

@interface Model : NSObject

- (id)initWithUniqueId:(id)uniqueId dataObject:(NSManagedObject *)dataObject;

@property (nonatomic, strong, readonly) id uniqueId;
@property (nonatomic, strong, readonly) NSManagedObject *dataObject;

@end

dataObject 出错后,此对象可以自行重新加载。但也许这种方法是错误的,不需要这种开销?而 NSManagedObject 只有在真正被删除而不是更新的情况下才应该被删除?然后如果object被更新了,我们可以使用KVO来处理属性的变化,如果object被删除,我们可以观察NSManagedObjectContext通知的变化,寻找被删除的对象。

我只是想知道您更喜欢哪种方式以及为什么(也许您喜欢其他方式)?提前致谢。

【问题讨论】:

【参考方案1】:

如果您使用的是外部数据源,则您自己的某种唯一 ID 版本是有意义的。

然后一切都变得简单。您加载数据,在保存上下文时更新持久存储,并通过NSNotificationCenter 发送通知。现在,所有侦听器都可以通过重新获取来简单地更新他们的数据。

(实现委托方法的获取结果控制器甚至不必通过通知中心通知。)

【讨论】:

以上是关于应更新数据时,NSManagedObject 的删除/插入与更新的主要内容,如果未能解决你的问题,请参考以下文章

更新相关 NSManagedObject 时更新 UITableView

如何使用更新的数据刷新 NSManagedObject - Core Data

从数据模型更新 NSManagedObject 类定义

核心数据 NSManagedObject:最大属性数?

当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?

使用不同的 NSManagedObjectContexts 时更新 NSManagedObject