NSManagedObjects中的Mutable集?

Gre*_*reg 8 iphone core-data objective-c ipad ios

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

@property (nonatomic, retain) NSSet *somethings;
...
@dynamic somethings;
Run Code Online (Sandbox Code Playgroud)

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

通过判断@dynamic,它似乎不关心我是否使用NSSet子类而不是一个NSSet,但我不想重写很多代码只是为了发现它不起作用.

lna*_*ger 11

根据Apple的核心数据编程指南,这应该始终声明为NSSet.

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

// myManagedObject is the managed object that has the somethings property.
NSMutableSet *mutableSomethings = [myManagedObject mutableSetValueForKey:@"somethings"];
Run Code Online (Sandbox Code Playgroud)

mutableSomethings然后可以将其修改为标准NSMutableSet并somethings进行更新,并适当调用KVO方法.

但请注意,可变集的许多功能(例如 addSomethingsObjectremoveSomethingsObject)已经在核心数据生成的访问器中提供,因此在许多情况下您不需要使用代理.


wby*_*ung 6

您应该将其保留为NSSet并执行以下操作之一:

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

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

NSMutableSet *somethings = [object mutableSetValueForKey:@"somethings"];
[somethings addObject:newObject];
Run Code Online (Sandbox Code Playgroud)

对于核心数据生成的访问者,您需要在标题中添加以下内容:

@interface MyManagedObject (CoreDataGenerated)
- (void)addSomethingsObject:(MySomething *)object;
- (void)removeSomethingsObject:(MySomething *)object;
- (void)addSomethings:(NSSet *)somethings;
- (void)removeSomethings:(NSSet *)somethings;
@end
Run Code Online (Sandbox Code Playgroud)

您不需要实现这些方法(Core Data会为您处理),您可以轻松地调用它们.这是我处理集合的首选方法,因为您可以从编译器中获得更好的类型检查.

您不应将其更改NSMutableSet为a 的原因是因为您很可能会导致崩溃和/或您的更改不会持久存储到您的Core Data存储中.

您可能还想查看mogenerator来帮助您创建所有Cocoa类.

  • @Johnykutty设置确保没有重复项.这应该没有效果. (2认同)