1

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

  • itemId(字符串)
  • 项目清单
  • 标题(字符串)
  • 父 ID(字符串)
  • 父级(与项目的关系)
  • 父标题(字符串)

parentId 指向另一个 Item 对象。

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

4

2 回答 2

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 的属性声明为只读 无需声明 Core Data 属性“parentTitle”。

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

  • 项目 A 是项目 B 的父项
  • A变成了故障
  • B 仍然处于活动状态,并且某些 View 绑定到 B.parentTitle

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

于 2010-07-04T08:14:14.437 回答
1

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

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

您唯一需要使用该keyPathsForValues...功能的情况是您正在根据该值更改某些内容。如果你只是访问它,直接使用 KVC。

于 2010-07-04T19:06:30.697 回答