核心数据:awakeFromFetch没有被调用未保存的上下文

时间:2009-11-25 09:16:40

标签: core-data

首先,让我说明重现'bug'的步骤。

  1. 创建一个新的NSManagedObject。
  2. 使用refreshObject对托管对象进行故障:mergeChanges:NO - 此时,对象收到didTurnIntoFault通知。
  3. 使用willAccessValueForKey再次'取消'对象:nil - 此时,应该接收awakeFromFetch通知但是没有通知。依赖它的所有代码都会失败,而烤面包机中的面包会燃烧:)
  4. 有趣的是,如果我在执行第2步之前'保存'托管对象上下文,一切正常,awakeFromFetch通知按预期进行。

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

    到目前为止,谷歌搜索没有任何具体内容,除了一位似乎遇到同样问题的绅士here

    所以我的问题是双重的 - 这真的是一个错误,如果确实如此,那么你建议其他的解决方法(原文如此)。

    编辑:这不是一个错误,但我只是愚蠢。请参阅,如果我在不保存对象的情况下将对象变为故障,则无需维护对象的历史记录。所以在这种情况下(即对于未保存的对象),没有awakeFromFetch的逻辑概念(因为它从未保存过)。如果我仍然混淆了,请告诉我。

    无论如何,事实证明我的“实际”问题是在其他地方 - 隐藏在2个问题之后

    1. 如果你使用refreshObject:mergeChanges:NO将一个对象变为错误以便打破核心数据可能已经建立的任何保留周期,你也必须对子对象做同样的事情 - 每个子对象可能已经参与循环保留与其他人将不得不手动故障。我(错误地)假设的是父母将自动打破孩子们的周期。

    2. 当这样的物体(即已被强力断裂的物体)通过在其上发射故障而复活时,不会调用自定义变压器的reverseTransform功能。在我看来这是一个错误,因为没有其他方法让我知道对象何时再次活着。无论如何,在这种情况下的解决方法是将staleness间隔设置为任意低的值,以便核心数据跳过其缓存并始终调用reverseTransform函数来复活对象。欢迎提出更好的建议。

    3. 它确实是那些日子之一:)

0 个答案:

没有答案