应更新数据时,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