Установка зависимости значения отношения «ко-многим» для временного атрибута Core Data - PullRequest
1 голос
/ 20 мая 2010

У меня относительно сложная структура отношений Core Data, и я пытаюсь выяснить, как установить зависимости (или наблюдения) значений между различными отношениями ко-многим. Позвольте мне начать с некоторой базовой информации. У меня есть класс с учениками, заданиями и оценками (ученики X заданий). Ради простоты, нам пока не нужно особо концентрироваться на заданиях.

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

Каждый ScoreObj имеет отношение «один к одному» с StudentObj и AssignmentObj .

  • ScoreObj имеет реальные атрибуты для числовой оценки, turnInDate и примечаний.

AssignmentObj.scores - набор объектов Score для этого задания (N = все учащиеся).

  • У AssignmentObj есть реальные атрибуты для name, dueDate, curveFunction, gradeWeight и maxPoints.

StudentObj.scores - набор объектов Score для этого учащегося (N = все задания).

  • StudentObj также имеет реальные атрибуты, такие как имя, studentID, адрес электронной почты и т. Д.
  • StudentObj имеет переходный (вычисленный, не сохраненный) атрибут с именем gradeTotal .

Этот последний предмет, gradeTotal, - настоящий рассол. он вычисляет общую оценку за семестр учащегося, используя оценки (ScoreObj) из всех своих заданий, связанных с ними заданий оценочных весов, кривых и максимальных баллов и других различных вещей.

Это значение gradeTotal отображается в столбце таблицы вместе со всеми оценками учащихся и их индивидуальными заданиями. Определение значения gradeTotal является относительно дорогой операцией, особенно для большого класса, поэтому я хочу запускать ее только при необходимости. Для простоты я не храню это значение gradeTotal в базовой модели данных. Я не против кэшировать его где-то, но у меня немного времени, чтобы определить, где и как лучше обновить этот кеш.

Мне нужно запускать этот расчет для каждого учащегося всякий раз, когда изменяется любое значение, влияющее на его оценку. Если бы это были простые отношения один к одному, я знаю, что мог бы использовать что-то вроде keyPathsForValuesAffectingGradeTotal ... но это больше похоже на отношение многие-к-одному-ко-многим. Кто-нибудь знает элегантное (и правильное KVC) решение? Я предполагаю, что смогу прорваться через все эти объекты оценки и задания и сказать им, чтобы они зарегистрировали своих студентов в качестве наблюдателей. Но это похоже на тупой подход.

1 Ответ

2 голосов
/ 21 мая 2010

Я только что опубликовал проект на github, который, вероятно, решает часть проблемы с наблюдениями

http://github.com/mbrugger/CoreDataDependentProperties

Более подробное описание проекта можно найти там.

- (NSArray *) keyPathsForValuesAffecting не решило бы вашу проблему, так как это работает только для однозначных отношений

Кроме того, вы не должны делать зависимый атрибут временным, поскольку он делает ваш контекст «грязным» (несохраненные изменения) уже после пересчета всех значений после загрузки

...