自动生成的NSManagedObject
属性的标准声明声明了这样的多个关系:
@property (nonatomic, retain) NSSet *somethings;
...
@dynamic somethings;
将声明更改为NSMutableSet
是否安全? CoreData组件是否仍能正常运行?
根据@dynamic
判断,probaby不关心我是否使用NSSet
子类而不是NSSet
,但我不想只重写大量代码发现它不起作用。
答案 0 :(得分:11)
根据Apple的Core Data Programming Guide,这应该始终声明为NSSet。
如果你想要一个可变代理(基本上是核心数据集的可变版本并且工作方式完全相同),那么你可以像这样使用函数mutableSetValueForKey
:
// myManagedObject is the managed object that has the somethings property.
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"];
然后可以将 mutableSomethings
修改为标准NSMutableSet,并更新somethings
并适当调用KVO方法。
但请注意,可变集的许多功能(例如addSomethingsObject
和removeSomethingsObject
)已在核心数据生成的访问器中提供,因此在许多情况下您不需要使用代理
答案 1 :(得分:6)
您应该将其保留为NSSet
并执行以下操作之一:
对于键值编码,您将像这样访问您的集合:
NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"];
[somethings addObject:newObject];
对于核心数据生成的访问者,您需要在标题中添加以下内容:
@interface MyManagedObject (CoreDataGenerated)
- (void)addSomethingsObject:(MySomething *)object;
- (void)removeSomethingsObject:(MySomething *)object;
- (void)addSomethings:(NSSet *)somethings;
- (void)removeSomethings:(NSSet *)somethings;
@end
您不需要实现这些方法(Core Data会为您处理),您可以轻松地调用它们。这是我处理集合的首选方法,因为您可以从编译器中获得更好的类型检查。
您不应将其更改为NSMutableSet
的原因是因为您很可能会导致崩溃和/或您的更改不会持久存储到您的Core Data商店中。
您可能还想查看mogenerator以帮助您创建所有Cocoa类。