根据另一个对象属性填充核心数据管理对象属性

时间:2010-07-04 04:51:54

标签: core-data nsmanagedobject

我有应用程序在CoreData中存储树结构。 有一个ManagedObject,“Item”,它有属性:

  • itemId(string)
  • 列表项
  • title(string)
  • parentId(string)
  • 父级(与项目的关系)
  • parentTitle(string)

parentId指向另一个Item对象。

如何使用父项的标题自动填充属性parentTitle?

2 个答案:

答案 0 :(得分:1)

这是实现所需功能的可能性:

// implement in Item.m
// manages KVO notifications
+ (NSSet *)keyPathsForValuesAffectingParentTitle
{
    return [NSSet setWithObjects:@"parent.title", nil];
}

// getter for parentTitle
- (NSString*) parentTitle
{
    return [self valueForKeyPath:@"parent.title"];
}

另外在Item.h中将parentTitle的属性声明为readonly 无需声明Core Data属性“parentTitle”。

我在此解决方案中遇到的唯一问题如下:

  • 项目A是项目B的父项
  • A变成了错误
  • B仍处于活动状态,某些View绑定到B.parentTitle

由于使用keyPathsForValuesAffecting声明的依赖关系,视图会收到通知,但是对象A已经出现故障(并且在关闭时无法再次出现故障)Core Data是否会自动管理此类错误和观察问题?

答案 1 :(得分:1)

虽然马丁的建议是衍生价值的一个很好的解决方案,但我对你的问题是,你为什么要这个?你根本就没有操纵父母的价值。由于您只是访问它,请直接通过KVC访问父级,例如:

Item *item = ...;
NSString *title = [item valueForKeyPath:@"parent.title"];
//Do something with title

如果您要根据该值更改内容,则唯一需要使用keyPathsForValues...功能的时间。如果您只是访问它,请直接使用KVC。