【问题标题】:Setting up a "to-many" relationship value dependency for a transient Core Data attribute为瞬态核心数据属性设置“对多”关系值依赖项
【发布时间】:2011-02-21 22:56:18
【问题描述】:

我有一个相对复杂的核心数据关系结构,我试图弄清楚如何在各种多对多关系之间建立价值依赖关系(或观察)。让我从一些基本信息开始。我有一个有学生、作业和成绩的教室(学生 X 作业)。为简单起见,我们实际上不必过多关注作业。

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

每个 ScoreObjStudentObjAssignmentObj 具有一对一的关系。

  • ScoreObj 具有数字等级、turnInDate 和注释的真实属性。

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

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

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

  • StudentObj 还具有真实属性,例如姓名、学生 ID、电子邮件等。
  • StudentObj 有一个名为 gradeTotaltransient(计算,未存储)属性。

最后一项,gradeTotal,是真正的泡菜。它使用学生所有作业的分数 (ScoreObj)、相关的作业gradeWeights、曲线和 maxPoints 以及其他各种东西来计算学生的总学期成绩。

这个 gradeTotal 值与所有学生及其个人作业成绩一起显示在表格列中。确定gradeTotal 的值是一个相对昂贵的操作,特别是对于一个大类,因此我只想在必要时运行它。为简单起见,我没有将gradeTotal 值存储在核心数据模型中。我不介意将它缓存在某个地方,但我正忙着确定在哪里以及如何最好地更新该缓存。

每当有任何值更改影响他们的总成绩时,我都需要为每个学生运行该计算。如果这是一个简单的一对一关系,我知道我可以使用 keyPathsForValuesAffectingGradeTotal 之类的东西......但它更像是一个多对一的关系。有谁知道优雅(并且 KVC 正确)的解决方案?我想我可以撕开所有这些分数和作业对象,并告诉他们将他们的学生注册为观察员。但这似乎是一种生硬的做法。

【问题讨论】:

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


    【解决方案1】:

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

    http://github.com/mbrugger/CoreDataDependentProperties

    可以在此处找到该项目的更详细说明。

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

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

    【讨论】:

    • 我喜欢这种方法。比我之前实现的鼠巢观察要优雅得多。
    猜你喜欢
    • 2013-04-26
    • 2011-06-17
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    相关资源
    最近更新 更多