我正在学习 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 消息直接发送到集合?为什么在教科书示例中它会向父对象发送消息以删除子对象?为什么这里没有发生?有没有办法调试并找出答案?
谢谢