Core data 当传感器数据集中的新对象接收到-awakeFromInsert消息时,关系为(null)

Core data 当传感器数据集中的新对象接收到-awakeFromInsert消息时,关系为(null),core-data,nsmanagedobject,nsarraycontroller,Core Data,Nsmanagedobject,Nsarraycontroller,以下-awakeFromInsert实现在用户按下add按钮时,设置UI中数组控制器实例化的新对象的属性: - (void)awakeFromInsert { [super awakeFromInsert]; NSLog(@"Adding perceptron %ld to layer %ld", self.indexInLayer, self.layer.indexInNetwork); NSLog(@"New perceptron added to layer %@"

以下
-awakeFromInsert
实现在用户按下add按钮时,设置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
}
问题是调用
-awakeFromInsert
时,没有设置新对象的
self.parent
关系(它是nil),因此我无法使用它访问父对象(例如有多少子对象或新对象的索引是什么)

上述代码的输出:

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有三个阵列控制器和三个
uitableview
。我对其进行了设置,使子阵列控制器仅包含选定父阵列的子阵列,而孙子阵列控制器仅包含选定子阵列的子阵列。将孩子或孙子添加到这些ArrayController时,他们将自动设置为当前选定父项的孩子。一切正常

用户界面在什么时候设置了
self.layer
?有人能确认这是在
-awakeFromInsert
之后发生的吗?如果是这样,如果我不能在
-awakeFromInsert
中配置新对象,我该如何配置它?我注意到,苹果的
-awakeFromInsert
文档中说,“当接收器第一次插入托管对象上下文时,核心数据框架会自动调用它。”


我需要有关层对象和数据结构其他部分的信息的原因是,我需要在创建新的感知器对象的同时自动实例化各种其他对象(感知器的子对象权重)。我是否应该使用
-awakeFromInsert
来执行此类任务?

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

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

如果您选择实现自己的setter方法,则需要遵循文档中的Apple指南,具体如下:

您必须确保调用相关的访问和更改 通知方法(willAccessValueForKey:,didAccessValueForKey:, willChangeValueForKey:,didChangeValueForKey:, willChangeValueForKey:带有设置突变:使用对象:,和 didChangeValueForKey:带有设置突变:使用对象:)

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