基于另一个对象属性填充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核心数据自动处理这样的故障&观察问题?
感谢您的解决方案! 拥有这样的parentTitle属性是不好的做法吗?不应该鼓励通过parent.title始终访问该值吗? – Rod 2010-07-04 11:07:15
我认为马库斯给出了一个很好的解释何时使用哪种解决方案。 – 2010-07-05 06:37:03