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方法将被适当调用。
但是请注意,核心数据生成的访问器中已经提供了可变集(如addSomethingsObject
和removeSomethingsObject
)的许多function,所以在许多情况下,您不需要使用代理。
您应该将其保存为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
你不需要实现这些方法(核心数据会为你处理),你可以轻松地调用它们。 这是处理集合的首选方式,因为您可以从编译器中获得更好的types检查。
你不应该改变它到NSMutableSet
的原因是因为你很可能会导致崩溃和/或你的更改不会持久到你的核心数据存储。
你可能也想看看mogenerator来帮助你创build所有的Cocoa类。
- 如何自动生成NSManagedObject子类与date而不是NSDatedate属性?
- 显示前一个date的NSLog
- 从asynchronousWeb服务响应更新托pipe对象的最佳方法?
- iPhone中的核心数据默认使用哪个持久性存储
- CoreData:使用NSDictionaryResultType提取多对多关系的计数
- 核心数据子上下文不是预取关系
- 定制核心数据生成访问器
- NSFetchedResultsController XCode 7问题
- UITableView删除/添加行导致CoreData:严重的应用程序错误,如果在SplitViewController的MasterView中select了另一个对象