2

当用户按下添加按钮时,以下-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被调用时没有设置(它是 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)

我很确定新对象已正确连接,因为indexInLayerUITableView调用它以将对象的索引添加到视图时,该方法可以正常工作:

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

我的数据模型有三个实体:网络、层、感知器排列为有序集,并通过一对多关系(即父-子-孙)连接到下一个。我的 UI 有三个数组控制器和三个UITableViews. 我已将其设置为子数组控制器仅包含选定父项的子项,而孙子数组控制器仅包含选定子项的孙子项。当我将子或孙子添加到这些数组控制器时,它们会自动设置为当前选定父级的子级。这一切都很好。

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

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

4

1 回答 1

0

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

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

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

您必须确保调用相关的访问和更改通知方法(willAccessValueForKey:、didAccessValueForKey:、willChangeValueForKey:、didChangeValueForKey:、willChangeValueForKey:withSetMutation:usingObjects: 和 didChangeValueForKey:withSetMutation:usingObjects:)。

我不知道为什么layer并且indexInLayer在您的awakeFromInsert方法中不可用;您可能需要解决该问题。

于 2013-09-29T01:26:52.500 回答