1

私は比較的複雑な 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 には、name、studentID、email などの実際の属性もあります。
  • StudentObj には、 gradeTotal という一時的な(計算された、保存されていない) 属性があります。

この最後の項目 gradeTotal は、本当のピクルスです。すべての課題のスコア (ScoreObj)、関連する課題の gradeWeights、曲線、maxPoints、およびその他のさまざまなものを使用して、学生の学期全体の成績を計算します。

このgradeTotal値は、すべての学生とその個々の課題の成績とともに、表の列に表示されます。gradeTotal の値を決定することは、特に大規模なクラスでは比較的コストのかかる操作であるため、必要な場合にのみ実行したいと考えています。簡単にするために、その gradeTotal 値をコア データ モデルに保存していません。どこかにキャッシュしてもかまいませんが、そのキャッシュをどこでどのように更新するのが最適かを判断するのにかなりの時間を費やしています。

gradeTotal に影響する値が変更されるたびに、各生徒に対してその計算を実行する必要があります。これが単純な 1 対 1 の関係であれば、keyPathsForValuesAffectingGradeTotalのようなものを使用できることはわかっていますが、それは多対 1 対多の関係に似ています。エレガントな(そしてKVCの正しい)ソリューションを知っている人はいますか?これらすべてのスコア オブジェクトと課題オブジェクトを破棄して、生徒をオブザーバーとして登録するように指示することができると思います。しかし、これは鈍い力のアプローチのようです。

4

1 に答える 1

2

おそらく観察に関する問題の一部を解決するプロジェクトをgithubに投稿しました

http://github.com/mbrugger/CoreDataDependentProperties

プロジェクトの詳細な説明は、そこにあります。

-(NSArray*) keyPathsForValuesAffecting は、対 1 の関係でのみ機能するため、問題を解決しませんでした。

さらに、依存属性を一時的にしないでください。ロード後にすべての値を再計算した後、コンテキストが「ダーティ」(保存されていない変更) になるためです。

于 2010-05-20T20:58:22.267 に答える