9

StackOverflow を何年も読んでいる皆さん、こんにちは。参加することにしました。これを解決するのに苦労しています:

「人」と「トラック」の 2 対多の関係を持つ「デポ」エンティティがあります。「デポ」オブジェクトが与えられたときに、関係の1つに変更(挿入、削除)があることを観察したい(そしてどの関係であるかを理解したい)。

現在、私はこれをやっています:

[mydepot addObserver:self forKeyPath:@"Trucks" options:NSKeyValueObservingOptionNew context:nil];

[mydepot addObserver:self forKeyPath:@"Persons" options:NSKeyValueObservingOptionNew context:nil];

ただし、関連する 2 つのコレクションのいずれかで何かが変更されるたびに、observeValueForKeyPath2 回 (キーパスごとに 1 回) 呼び出されます。

私はそれを間違っていますか?"change" dict を見ると、(OptionOld も観察して) 予期しない変更は表示されません (人を変更しても、トラックは変更されません) が、通知は引き続き発生します。

ありがとう、ピエトロ

編集: どちらの場合も、「変更」辞書には「新規」フィールドに関係全体が含まれているようです。(もちろん、1回は人、1回はトラック)

edit2: たまたま単純なプロパティを観察していたとしても、managedctx の保存操作に関連している可能性はありますか? 保存すると、オブジェクト全体が変更されたと見なされます。

4

5 に答える 5

10

Key Value Observing Programming Guide では、次のように述べています。

Core Data を使用している場合は、管理対象オブジェクト コンテキストのオブザーバーとして、親をアプリケーションの通知センターに登録できます。親は、キー値の監視と同様の方法で、子によって投稿された関連する変更通知に応答する必要があります。

これは事実上、推奨される方法は を使用せずaddObserver:forKeyPath:options:context:、代わりに に登録することであることを意味する可能性がありNSManagedObjectContextDidSaveNotificationます。

于 2013-03-27T22:32:58.650 に答える
3

トラックをアトミックに設定すると ( something.trucks = newArray)、値セット通知が表示されます。代わりに、によって返される可変配列で addObject/removeObject を使用し[ something mutableArrayValueForKey:@"trucks" ]ます。

KVOで生成されたアクセサーなどを使用insertObjectIntoTrucks:/実装することもできます.countOfTrucks

KVO のドキュメントを読む必要があります。ここの「インデックス付き対多関係のコンプライアンス」および「順序付けされていない対多関係のコンプライアンス」の下。

于 2013-03-27T15:57:19.220 に答える
1

私は同じ問題を抱えています。そして、私はまだこの問題に固執しています。

しかし、私が確信しているのは、最初に呼び出され[Depot addPerson:person]た理由は次のようなことをすることであり、2回目に呼び出された理由はMOC保存アクションがNSManagedObjectContextDidSaveNotification通知を投稿し、オブザーバーに別の変更が起こったと思わせることです.

そして、私の問題でさらに悪いのは、オブザーバーが原因で、コアデータの変更が失われることです。

これは、ほぼ2日間、私がとても愚かだと感じさせます.

NSManagedObjectContextDidSaveNotification@Mundi の回答で registerを使用することを考えています

そして、誰かがより良い方法を持っている場合は、できるだけ早く教えてください

于 2013-05-17T15:00:51.797 に答える
0

アイテムが追加されたとき、または多トラックの関係から削除されたときに知りたい場合は、次のようにカウント (View Controller のどこか) で KVO を実行する必要があります。

[self.depot addObserver:self forKeyPath:@"trucks.@count" options:0 context:nil];

于 2018-08-02T14:10:01.040 に答える