当NSOrderedSet中的新对象收到-awakeFromInsert消息时,关系为(null)

时间:2012-12-18 05:56:03

标签: core-data nsmanagedobject nsarraycontroller

当用户按下添加按钮时,以下-awakeFromInsert实现设置由UI中的数组控制器实例化的新对象的属性:

- (void)awakeFromInsert
{
    [super awakeFromInsert];
    NSLog(@"Adding perceptron %ld to layer %ld", self.indexInLayer, self.layer.indexInNetwork);
    NSLog(@"New perceptron added to layer %@", self.layer );
    // more code here to do the configuration
}

问题是当调用self.parent时它没有设置新对象的-awakeFromInsert关系(它是零)所以我不能用它来访问父对象(例如如何有很多孩子或新对象是什么索引。)

输出上述代码:

2012-12-17 21:36:39.309 MLPManager[98112:403] Adding perceptron 0 to layer 0
2012-12-17 21:36:39.309 MLPManager[98112:403] New perceptron added to layer (null)

我非常确定新对象是否正确连接,因为indexInLayer方法在UITableView调用它以将对象的索引添加到视图时可以正常工作:

- (NSUInteger)indexInLayer
{
    NSUInteger index = [self.layer.perceptrons indexOfObject:self];
    //NSLog(@"indexInLayer returning %ld", index );
    return index;
}

我的数据模型有三个实体:网络,层,感知器排列为有序集,并通过多对多关系(即父 - 子 - 孙)连接到下一个。我的UI有三个阵列控制器和三个UITableViews。我已经设置它,以便子数组控制器只包含所选父节点的子节点,并且孙子节点控制器只包含所选子节点的孙子节点。当我向这些数组控制器添加子项或孙项时,它们会自动设置为当前所选父项的子项。一切正常。

UI设置的self.layer是什么时候?有人可以确认-awakeFromInsert后发生这种情况吗?如果是这样,如果我不能在-awakeFromInsert内执行此操作,我应该如何配置新对象?我注意到-awakeFromInsert的Apple文档说它“在接收器首次插入托管对象上下文时由Core Data框架自动调用。”

我需要有关图层对象和数据结构其他部分的信息的原因是我需要在新感知器对象的同时自动实例化各种其他对象(感知器的子项的权重)。我应该使用-awakeFromInsert来完成这些任务吗?

1 个答案:

答案 0 :(得分:0)

首先,您的代码中似乎存在模型(NSManagedObject)和视图(UITableView)对象之间的耦合。根据模型 - 视图 - 控制器设计模式,不推荐这样做。

layerindexInLayer不是NSManagedObject的标准属性,因此我假设这些是您实体中的属性。作为在awakeFromInsert中进行设置的替代方法,我想知道您是否可以为您的属性实现自己的setter方法,以便您可以在所需数据可用时执行必要的工作。

如果您选择实施自己的setter方法,则需要遵循Managed Object Accessor Methods文档中Apple的指导,具体来说:

  

您必须确保调用相关的访问权限并进行更改   通知方法(willAccessValueForKey:,didAccessValueForKey:,   willChangeValueForKey:,didChangeValueForKey:,   willChangeValueForKey:withSetMutation:usingObjects:,and   didChangeValueForKey:withSetMutation:usingObjects:)

我不知道为什么layerindexInLayer在您的awakeFromInsert方法中无法使用;你可能需要解决这个问题。