CoreDataにツリー構造を保存するアプリがあります。ManagedObject "Item"があり、次の属性があります。
- itemId(文字列)
- リストアイテム
- タイトル(文字列)
- parentId(文字列)
- 親(アイテムとの関係)
- parentTitle(文字列)
parentIdは別のItemオブジェクトを指します。
プロパティparentTitleに親アイテムのタイトルが自動的に入力されるようにするにはどうすればよいですか?
CoreDataにツリー構造を保存するアプリがあります。ManagedObject "Item"があり、次の属性があります。
parentIdは別のItemオブジェクトを指します。
プロパティparentTitleに親アイテムのタイトルが自動的に入力されるようにするにはどうすればよいですか?
これは、目的の機能を実現する可能性です。
// 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のプロパティを読み取り専用として宣言します。CoreData属性「parentTitle」を宣言する必要はありません。
このソリューションで私が目にする唯一の問題は次のとおりです。
keyPathsForValuesAffectingで宣言された依存関係のため、ビューは通知を受け取りますが、オブジェクトAはすでに障害が発生しています(シャットダウン時に再度障害が発生することはありません)。CoreDataはこのような障害と監視の問題を自動的に管理しますか?
マーティンの提案は派生値の良い解決策ですが、あなたの質問は、なぜこれが必要なのかということです。親からの値を操作しているわけではありません。アクセスしているだけなので、次のようにKVCを介して親に直接アクセスします。
Item *item = ...;
NSString *title = [item valueForKeyPath:@"parent.title"];
//Do something with title
この機能を使用するのkeyPathsForValues...
は、その値に基づいて何かを変更する場合のみです。アクセスするだけの場合は、KVCを直接使用してください。