基于另一个对象属性填充CoreData ManagedObject属性

问题描述:

我有在CoreData中存储树结构的应用程序。 有一个ManagedObject, “项目”,它具有属性:基于另一个对象属性填充CoreData ManagedObject属性

  • 的itemId(串)
  • 列表项
  • 标题(字符串)
  • 的parentId(串)
  • 父(关系项)
  • parentTitle(串)

的parentId点另一个Item对象。

我如何让属性parentTitle自动填充父项的标题?

虽然Martin的建议是派生值的一个很好的解决方案,但我对你的问题是,你为什么要这么做?你永远不会操纵父母的价值。因为你只是访问它,直接通过KVC访问父如:

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

你想使用keyPathsForValues...功能的唯一情况是,如果你正在改变基于该值的东西。如果您只是访问它,请直接使用KVC。

这是为了实现期望的功能的可能性:

// 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"]; 
} 

另外声明属性parentTitle在Item.h 为只读无需声明一个核心数据的属性“parentTitle”。

我用这个解决方案中看到的唯一的问题是:

  • 项目A是B项的父
  • 一个被变成故障
  • B是仍然活跃,一些观点是必然B.parentTitle

由于使用keyPathsForValuesAffecting声明的依赖关系,视图获取通知,但对象A已经发生故障(并且在关闭时不能再次无效)d oes核心数据自动处理这样的故障&观察问题?

+0

感谢您的解决方案! 拥有这样的parentTitle属性是不好的做法吗?不应该鼓励通过parent.title始终访问该值吗? – Rod 2010-07-04 11:07:15

+0

我认为马库斯给出了一个很好的解释何时使用哪种解决方案。 – 2010-07-05 06:37:03