Core data 核心数据:未保存上下文未调用awakeFromFetch

Core data 核心数据:未保存上下文未调用awakeFromFetch,core-data,Core Data,首先,让我举例说明重现“bug”的步骤 创建一个新的NSManagedObject。 使用refreshObject:mergeChanges:NO为托管对象设置故障-此时,对象会收到didTurnIntoFault通知。 使用willAccessValueForKey:nil再次“取消结果”对象-此时,应该会收到awakeFromFetch通知,但没有收到通知。所有点火失败,烤面包机中的面包燃烧: 有趣的是,如果我在执行步骤2之前“保存”托管对象上下文,那么一切都正常,awakeFromFet

首先,让我举例说明重现“bug”的步骤

创建一个新的NSManagedObject。 使用refreshObject:mergeChanges:NO为托管对象设置故障-此时,对象会收到didTurnIntoFault通知。 使用willAccessValueForKey:nil再次“取消结果”对象-此时,应该会收到awakeFromFetch通知,但没有收到通知。所有点火失败,烤面包机中的面包燃烧: 有趣的是,如果我在执行步骤2之前“保存”托管对象上下文,那么一切都正常,awakeFromFetch通知也会如预期的那样出现

目前我使用的解决方法是定期“保存”上下文,但这更像是一种黑客行为,因为我们实际上需要在应用程序终止时保存一次上下文

到目前为止,谷歌还没有得到任何具体的回报,只有一位绅士似乎遇到了同样的问题

所以我的问题有两个——这真的是一个bug吗?如果是的话,那么你还建议什么样的漫游呢

编辑:这不是一个错误,但那只是我的愚蠢。看,如果我在不保存的情况下将一个对象转化为故障,那么就没有要维护的对象历史记录。因此,在这种情况下,即对于未保存的对象,没有awakeFromFetch的逻辑概念,因为它从未保存过。如果我还是搞混了,请一定要告诉我

不管怎么说,结果证明我的“实际”问题是在其他地方——隐藏在2个gotcha的后面

如果使用refreshObject:mergeChanges:NO将对象转为故障,以中断核心数据可能建立的任何保留周期,则还必须对子对象执行相同的操作-每个可能与其他人参与循环保留的子对象都必须手动出错。我错误地认为,指责父母会自动打破孩子之间的循环

当通过在自定义转换器上触发故障来恢复已发生强制故障的对象时,将不会调用该对象的reverseTransform函数。这在我眼里是一个错误,因为没有其他方法让我知道这个物体何时又活了。无论如何,本例中的解决方法是将过时间隔设置为任意低的值,以便核心数据跳过其缓存并始终调用reverseTransform函数来恢复对象。欢迎提出更好的建议


这真的是其中的一天:

你能创造一个答案而不是把它嵌入你的问题吗?你能创造一个答案而不是把它嵌入你的问题吗?