0

我正在学习 Cocoa 并遵循 Aaron Hillegass 的书(第 32 章核心数据关系)中的一个示例,但无法让它为我自己的应用程序工作。

我有一个核心数据模型,它由一个与子对象有一对多关系的父对象组成,但我的是一个有序集合,这与书中的基本 NSMutableSet 不同。

每个对象(父对象和子对象)都有关联的 NSArrayControllers,我在 Interface Builder 中开发了一个基于文档的应用程序,其中包含按钮和绑定,用于从选定的父对象(称为层)。这一切都在工作。

现在我想拦截 add 和 remove 方法,以便在添加或删除孩子时我可以自己编写代码。

在 Hillegass 的书中,他通过创建 NSManagedObjects 子类然后在代码中实现 addEmployeesObject: 和 removeEmployeesObject: 方法来做到这一点。所以这就是我尝试的。

这是我由 XCode 编辑器创建的子类:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Network, Perceptron;

@interface Layer : NSManagedObject

@property (nonatomic, retain) Network *network;
@property (nonatomic, retain) NSOrderedSet *perceptrons;
@end

@interface Layer (CoreDataGeneratedAccessors)

- (void)insertObject:(Perceptron *)value inPerceptronsAtIndex:(NSUInteger)idx;
- (void)removeObjectFromPerceptronsAtIndex:(NSUInteger)idx;
- (void)insertPerceptrons:(NSArray *)value atIndexes:(NSIndexSet *)indexes;
- (void)removePerceptronsAtIndexes:(NSIndexSet *)indexes;
- (void)replaceObjectInPerceptronsAtIndex:(NSUInteger)idx withObject:(Perceptron *)value;
- (void)replacePerceptronsAtIndexes:(NSIndexSet *)indexes withPerceptrons:(NSArray *)values;
- (void)addPerceptronsObject:(Perceptron *)value;
- (void)removePerceptronsObject:(Perceptron *)value;
- (void)addPerceptrons:(NSOrderedSet *)values;
- (void)removePerceptrons:(NSOrderedSet *)values;
@end

这是我根据教科书在 Layer.m 中实现的两种方法:

- (void)addPerceptronsObject:(Perceptron *)value
{
    NSLog(@"Network '%@' layer %lu is adding perceptron %lu", [[self network] name], [self indexInNetwork], [value indexInLayer]);
    NSSet *s = [NSSet setWithObject:value];
    [self willChangeValueForKey:@"perceptrons"
                withSetMutation:NSKeyValueUnionSetMutation
                   usingObjects:s];
    [[self primitiveValueForKey:@"perceptrons"] addObject:value];
    [self didChangeValueForKey:@"perceptrons"
     withSetMutation:NSKeyValueUnionSetMutation
                  usingObjects:s];
}

- (void)removePerceptronsObject:(Perceptron *)value
{
    NSLog(@"Network '%@' layer %lu is removing perceptron %lu", [[self network] name], [self indexInNetwork], [value indexInLayer]);
    NSSet *s = [NSSet setWithObject:value];
    [self willChangeValueForKey:@"perceptrons"
                withSetMutation:NSKeyValueUnionSetMutation
                   usingObjects:s];
    [[self primitiveValueForKey:@"perceptrons"] removeObject:value];
    [self didChangeValueForKey:@"perceptrons"
               withSetMutation:NSKeyValueUnionSetMutation
                  usingObjects:s];
}

我把 NSLogs 放进去,所以我确定它们不会被调用——当我添加/删除感知器对象时,控制台中什么也没有。

ArrayController 在收到 add: remove: 消息时会做什么?是否将 addObject/removeObject 消息直接发送到集合?为什么在教科书示例中它会向父对象发送消息以删除子对象?为什么这里没有发生?有没有办法调试并找出答案?

谢谢

4

1 回答 1

1

账单,

您正在覆盖由 Core Data 动态生成的方法。我怀疑您在查找表中的静态条目只是被覆盖了。这些方法与@property期望被覆盖的方法不同。

从更大的意义上说,为什么要在此处插入代码?当对象被实例化时,有更好的支持方法为您的实现设计。您不妨检查一下-awakeFromFetch-awakeFromInsert

安德鲁

于 2012-12-10T13:41:07.277 回答