托管对象上下文保存和 refreshObject:mergeChanges 有啥区别:

Posted

技术标签:

【中文标题】托管对象上下文保存和 refreshObject:mergeChanges 有啥区别:【英文标题】:What is the difference between managed object context save and refreshObject:mergeChanges:托管对象上下文保存和 refreshObject:mergeChanges 有什么区别: 【发布时间】:2013-03-15 22:26:36 【问题描述】:

你好有什么区别

  [self.context refreshObject:site mergeChanges:YES];

  [self.context save:nil];

有时我同时使用它们,有时我只使用save。它适用于两种情况。

【问题讨论】:

【参考方案1】:

-save: 保存您对上下文中的任何托管对象所做的更改。这意味着它们被刷新到持久存储协调器,然后将它们写入持久存储,持久存储将它们写入磁盘(假设是磁盘支持的存储)。

另一方面,-refreshObject:mergeChanges: 做了一些完全不同的事情。它读取来自持久存储协调器的对象的当前状态(从持久存储中读取,等等)。为mergeChanges 传递YES 意味着保持对对象的任何本地修改不变,并且只更新未更改的字段。这与-save: 几乎相反。

作为一个简单的思想实验,如果您运行 -save: 然后终止您的应用程序,则在下次启动时您修改的数据仍然可用。如果您运行 -refreshObject:mergeChanges: 然后终止您的应用程序,您的任何本地更改都将丢失。

【讨论】:

所以最好使用refreshObject,并在appWillResignActive中调用-save:? @Devfly:不。我很困惑为什么你认为-refreshObject: 在保存之前很适合使用。 @Devfly:如果您知道对象从另一个上下文更改,并且希望更改在当前上下文中可见,则使用-refreshObject:mergeChanges:。就是这样。 不是每个持久存储都有一个上下文吗?无论如何,谢谢那是我需要听到的! :) @Devfly:不。一个常见的设置是每个线程一个上下文,但是您可以拥有任意数量的上下文来访问同一个持久存储。

以上是关于托管对象上下文保存和 refreshObject:mergeChanges 有啥区别:的主要内容,如果未能解决你的问题,请参考以下文章

使多个上下文中的 NSManagedObjects 保持同步

使用 NSManagedObjectContext refreshObject 崩溃

为啥保存托管对象上下文更改 isDeleted 值?

核心数据和托管对象上下文

托管对象上下文不会保存——没有错误

托管对象上下文未保存到持久存储