【问题标题】:Why is awakeFromInsert called twice?为什么 awakeFromInsert 被调用了两次?
【发布时间】:2013-11-20 06:57:10
【问题描述】:

我已经实现awakeFromInsert 来在我的核心数据对象中设置一些默认值和关系。但是,该方法被调用了两次,这意味着我添加的 to-many 值被添加了多次。

我正在使用父子托管对象上下文。

什么给了?

【问题讨论】:

  • 你在打电话给[super awakeFromInsert];吗?
  • 我不是,谢谢,但它仍然调用了两次。

标签: objective-c cocoa-touch cocoa core-data


【解决方案1】:

awakeFromInsert 将在您将对象插入其初始上下文时调用。当保存此上下文并将更改推送到父上下文时,将再次调用它。

您可以查询self.managedObjectContext 属性以确定调用该方法的情况。根据您的特定用例,您可能需要检查是否存在 parentContext 并采取相应措施。

【讨论】:

  • 只有我认为这是一个错误吗?不确定它是在您还是 Apple 方面,但 documentation of awakeFromInsert 明确表示此方法在对象生命周期中仅调用一次。
  • 您不是唯一一个 - 更多讨论请参见 lists.apple.com/archives/cocoa-dev/2011/Nov/msg00734.html。我把这个问题放在这里是为了可见性,因为那个线程已经很老了。该文档是“正确的”,因为 self 在每个上下文中都是不同的对象。
【解决方案2】:

感谢 jrturton 的帮助:

这是最简单的一个: 当 parentContext 为 null 时,意味着当保存此上下文时,您可以执行自定义逻辑,例如递增表号

- (void)awakeFromInsert
 {

     if (!self.managedObjectContext.parentContext) {
         //setting tableNumber

         [self willChangeValueForKey:@"number"];
         [self setPrimitiveNumber:tableNumber];
         [self didChangeValueForKey:@"number"];
    }

 }

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 1970-01-01
    相关资源
    最近更新 更多