applicationWillResignActive上的核心数据对象没问题但applicationDidBecomeActive上有<fault> </fault>

时间:2014-05-28 22:55:06

标签: core-data save

当使用核心数据时,我发现了一个问题,我用[上下文保存]保存了X个对象,一切正常,直到我关闭应用程序并再次打开它,所以所有相同的对象都有“数据:故障” 。我已经尝试在applicationWillResignActive上保存上下文,以确保堆栈已保存但无济于事。当我在应用程序重新登录活动期间检查对象时,它们很好但是在应用程序变为活动状态时检查它们会显示故障。我错过了什么?我不确定这些核心数据对象在app退出时是如何出错的。

1 个答案:

答案 0 :(得分:0)

因此,故障是核心数据保存内存的一种方法,直到您需要对象并找到我最不期望的答案:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Articles/cdFaultingUniquing.html

“故障处理是透明的 - 您不必执行提取来实现故障。如果在某个阶段访问了故障对象的持久属性,则Core Data会自动检索该对象的数据并初始化该对象(有关不会导致错误触发的方法列表,请参阅NSManagedObject类参考。)此过程通常称为触发故障。如果您向Department对象发送消息以获取其名称,则故障将触发 - 在这种情况下,Core Data会为您执行提取以检索所有对象的属性。

发射故障 核心数据在必要时(当访问故障的持久属性时)自动触发故障。但是,单独触发故障可能效率低下,并且有更好的策略可以从持久性存储中获取数据(请参阅“使用SQLite存储进行批处理故障和预取”)。有关如何有效处理故障和关系的更多信息,请参阅“获取被管理对象”。

当触发故障时,如果数据在其缓存中可用,则Core Data不会返回存储。通过缓存命中,将故障转换为实现的托管对象非常快 - 它与托管对象的正常实例化基本相同。如果数据在缓存中不可用,Core Data会自动执行故障对象的提取;这导致到持久性存储的往返以获取数据,并且数据再次缓存在内存中。

这一点的必然结果是,对象是否是错误与其数据是否已从商店检索不同。对象是否是错误只是意味着给定的托管对象是否已填充其所有属性并且可以使用。如果需要确定对象是否是故障,可以向其发送isFault消息而不触发故障。如果isFault返回NO,则数据必须在内存中。但是,如果isFault返回YES,则不表示数据不在内存中。数据可能在内存中,也可能不在内,这取决于影响缓存的许多因素。 “