1

CoreDataにツリー構造を保存するアプリがあります。ManagedObject "Item"があり、次の属性があります。

  • itemId(文字列)
  • リストアイテム
  • タイトル(文字列)
  • parentId(文字列)
  • 親(アイテムとの関係)
  • parentTitle(文字列)

parentIdは別のItemオブジェクトを指します。

プロパティparentTitleに親アイテムのタイトルが自動的に入力されるようにするにはどうすればよいですか?

4

2 に答える 2

1

これは、目的の機能を実現する可能性です。

// 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」を宣言する必要はありません。

このソリューションで私が目にする唯一の問題は次のとおりです。

  • アイテムAはアイテムBの親です
  • Aが障害になります
  • Bはまだアクティブであり、一部のビューはB.parentTitleにバインドされています

keyPathsForValuesAffectingで宣言された依存関係のため、ビューは通知を受け取りますが、オブジェクトAはすでに障害が発生しています(シャットダウン時に再度障害が発生することはありません)。CoreDataはこのような障害と監視の問題を自動的に管理しますか?

于 2010-07-04T08:14:14.437 に答える
1

マーティンの提案は派生値の良い解決策ですが、あなたの質問は、なぜこれが必要なのかということです。親からの値を操作しているわけではありません。アクセスしているだけなので、次のようにKVCを介して親に直接アクセスします。

Item *item = ...;
NSString *title = [item valueForKeyPath:@"parent.title"];
//Do something with title

この機能を使用するのkeyPathsForValues...は、その値に基づいて何かを変更する場合のみです。アクセスするだけの場合は、KVCを直接使用してください。

于 2010-07-04T19:06:30.697 に答える