自定义NSManagedObject类以从NSOrderedSet添加/删除Object

时间:2012-12-10 05:33:05

标签: core-data nsarraycontroller nsorderedset

我正在学习Cocoa,并在Aaron Hillegass的书(第32章核心数据关系)中作了一个例子,并且不能让它适用于我自己的应用程序。

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

每个对象,父对象和子对象都有关联的NSArrayControllers,我在Interface Builder中开发了一个基于文档的应用程序,其中包含按钮和绑定,用于添加/删除所选父对象(在我的例子中称为感知器) (称为图层)。这一切都有效。

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

在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:message时会做什么?是否直接向集合发送addObject / removeObject消息?为什么在教科书示例中它会向父对象发送消息以删除子项?为什么这不会发生?有没有办法调试这个并找出来?

感谢

1 个答案:

答案 0 :(得分:1)

比尔,

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

从更广泛的意义上说,为什么要在此处插入代码?在实例化对象时,为您的实现设计了更好的受支持方法。您可能希望检查-awakeFromFetch-awakeFromInsert

安德鲁