【问题标题】:Mutable sets in NSManagedObjects?NSManagedObject 中的可变集?
【发布时间】:2012-03-28 13:27:56
【问题描述】:

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

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

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

@dynamic 来看,它可能不在乎我是否使用NSSet 子类而不是NSSet,但我不想重写很多代码只是为了发现它没有'没用。

【问题讨论】:

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


    【解决方案1】:

    根据 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)已在核心数据生成访问器中提供,因此在许多情况下您不需要使用代理。

    【讨论】:

      【解决方案2】:

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

      1. 使用key value coding
      2. 添加核心data generated accessors

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

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

      【讨论】:

      • 如果我将已经存在的对象添加到关系中会导致任何问题
      • @Johnykutty 设置确保没有重复。这应该没有效果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 2016-10-02
      相关资源
      最近更新 更多