为瞬态Core Data属性设置“to-many”关系值依赖关系

时间:2010-05-20 15:43:58

标签: objective-c cocoa core-data key-value-coding key-value-observing

我有一个相对复杂的核心数据关系结构,我正试图弄清楚如何在各种多对多关系中设置值依赖关系(或观察)。让我先从一些基本信息开始。我有一个有学生,作业和成绩的课堂(学生X作业)。为简单起见,我们实际上并不需要过多关注作业。

StudentObj <--->> ScoreObj <<---> AssignmentObj

每个 ScoreObj StudentObj AssignmentObj 具有一对一的关系。

  • ScoreObj具有数字等级的真实属性,turnInDate和notes。

AssignmentObj.scores是该作业的Score对象集(N =所有学生)。

  • AssignmentObj具有name,dueDate,curveFunction,gradeWeight和maxPoints的真实属性。

StudentObj.scores是该学生的Score对象集(N =所有作业)。

  • StudentObj还有真实的属性,如姓名,学生ID,电子邮件等。
  • StudentObj有一个名为 gradeTotal 瞬态(已计算,未存储)属性。

这最后一项,gradeTotal,是真正的泡菜。它使用所有作业中的分数(ScoreObj),相关的分配等级权重,曲线和maxPoints以及其他各种内容来计算学生的整个学期成绩。

gradeTotal 值显示在表格列中,同时显示所有学生及其各自的作业成绩。确定gradeTotal的值是相对昂贵的操作,特别是对于大类,因此我想仅在必要时运行它。为简单起见,我没有将gradeTotal值存储在核心数据模型中。我不介意在某个地方缓存它,但我有时间确定最佳更新缓存的位置和方式。

每当任何影响其gradeTotal的值发生变化时,我都需要为每个学生运行该计算。如果这是一个简单的一对一的关系,我知道我可以使用像 keyPathsForValuesAffectingGradeTotal 这样的东西......但它更像是一对多的一对多关系。有谁知道优雅(和KVC正确)的解决方案?我想我可以撕掉所有那些得分和分配对象并告诉他们将他们的学生注册为观察员。但这似乎是一种生硬的态度。

1 个答案:

答案 0 :(得分:2)

我刚刚在github上发布一个项目,它可能通过观察来解决部分问题

http://github.com/mbrugger/CoreDataDependentProperties

可以在那里找到更详细的项目描述。

- (NSArray *)keyPathsForValuesAffecting不会解决您的问题,因为这只适用于一对一的关系

此外,您不应该使依赖属性成为瞬态,因为在加载后重新计算所有值后,它会使您的上下文“变脏”(未保存的更改)