5

Core Dataを使用して、属性と関係の両方を持つエンティティをモデル化しています。属性の1つを他の2つの関係に依存させたいと思います。

Core Data FAQおよび他のいくつかの例は+(NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key、この目的で使用されます。ただし、これはすべての関係プロパティに対してのみ呼び出されるようであり、どの属性に対しても呼び出されないようです。さらにkeyPathsForValuesAffecting<key>、私の属性のいずれかが呼び出されることはありません。

これは正常な動作ですか、それとも何かが足りませんか?他の属性またはプロパティに基づいて1つの属性を計算するにはどうすればよいですか。startLocationとstopLocationを設定することにより、距離?

4

1 に答える 1

8

数日後に自分の問題の解決策が見つかったようですが、何かが足りなかったことがわかりました。

NSKeyValueObserving Protocol Referenceのメソッドの説明を読み直した後keysPathsForValuesAffectingValueForKey:、次の文の意味に気づきました。

キーのオブザーバーが受信クラスのインスタンスに登録されると、Key-Valueオブザーバー自体が同じインスタンスのすべてのキーパスを自動的に監視し、キーの変更通知をオブザーバーに送信します。キーパスが変更されます。

つまり、インスタンスには、属性の変更を監視するオブザーバーが必要です<key>

[myInstance addObserver:myObserver forKeyPath:attributeKey options:nil context:nil];

オブザーバーを登録するとすぐに、プロトコルはkeysPathsForValuesAffectingValueForKey特定の属性キーを呼び出します。このメソッドが空でないキーパスのセットを返す場合、これらのキーパスのいずれかに変更が加えられると、属性に直接変更があったことを通知するだけでなく、KVOは属性の変更通知を発行します。

Core Dataはすでにオブザーバーを使用して逆の関係を最新に保つため、関係キーは自動的に呼び出されます。

属性を同じエンティティ内の別の属性または関係に依存させたい特定の場合は、次のことを行う必要があります。

  1. awakeFromInsert:メソッドにオブザーバーを追加します。addObserver:forKeyPath:options:context:
  2. 実装keyPathsForValuesAffectingValueForKey:またはkeyPathsForValuesAffecting<key>
  3. observeValueForKeyPath:ofObject:change:context関連する変更通知に作用するように属性キーパスを実装します。つまり、属性値を更新します。
于 2013-03-27T14:04:09.907 に答える