NSManagedObjects中的可变集?

自动生成的NSManagedObject属性的标准声明声明了如下所示的多对多关系:

 @property (nonatomic, retain) NSSet *somethings; ... @dynamic somethings; 

将该声明更改为NSMutableSet是否安全? CoreData组件是否仍能正常工作?

@dynamic判断,probaby并不关心我使用的是NSSet子类而不是NSSet ,但是我不想重写很多代码来发现它不起作用。

根据苹果的核心数据编程指南 ,这应该总是被宣布为NSSet。

如果你想要一个可变的代理(这基本上是核心数据集的可变版本,工作原理完全一样),那么你可以使用函数mutableSetValueForKey像这样:

 // myManagedObject is the managed object that has the somethings property. NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"]; 

mutableSomethings然后可以修改为一个标准的NSMutableSet和somethings将被更新和KVO方法将被适当调用。

但是请注意,核心数据生成的访问器中已经提供了可变集(如addSomethingsObjectremoveSomethingsObject )的许多function,所以在许多情况下,您不需要使用代理。

您应该将其保存为NSSet然后执行以下操作之一:

  1. 使用键值编码
  2. 添加生成访问器的核心数据

对于键值编码,您可以像这样访问您的集合:

 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 

你不需要实现这些方法(核心数据会为你处理),你可以轻松地调用它们。 这是处理集合的首选方式,因为您可以从编译器中获得更好的types检查。

你不应该改变它到NSMutableSet的原因是因为你很可能会导致崩溃和/或你的更改不会持久到你的核心数据存储。

你可能也想看看mogenerator来帮助你创build所有的Cocoa类。