NSManagedObjects中的Mutable集?

时间:2012-03-12 05:26:14

标签: iphone objective-c ios ipad core-data

自动生成的NSManagedObject属性的标准声明声明了这样的多个关系:

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

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

根据@dynamic判断,probaby不关心我是否使用NSSet子类而不是NSSet,但我不想只重写大量代码发现它不起作用。

2 个答案:

答案 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方法。

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

答案 1 :(得分:6)

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

  1. 使用key value coding
  2. 添加核心data generated accessors
  3. 对于键值编码,您将像这样访问您的集合:

    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类。