2012-02-15 14 views
3

私はオブジェクトを持っています - ConfigAccount属性がConfigに変更されているかどうかを知りたいこれが起こると、私はNSNotificationを送信して、Accountの変更が気になるすべてのコードがわかるようにしたいと思います。私の最初の考えは、私のNSManagedObjectサブクラスで、setAccountメソッドをオーバーライドして、AccountDidChangetrueに設定するという方法でした。その後、didSaveの場合AccountDidChangetrueだった場合、通知を送信してからfalseに戻します。より良い方法がありますか?私の問題は、私が読んだことから、AccountDidChangefalseに戻すことで、私のオブジェクトが汚れてしまい、再び保存する必要があるということです。コアデータNSManagedObject - 属性が変更された場合のトラッキング

もう少し情報: Configオブジェクトは、アプリケーションの現在の設定です。 Accountは実際にActiveAccountに変更できます。すべてのアカウントのリストを持つAccountエンティティとの関係があります。アイデアは、ユーザーがアプリケーションのアクティブなアカウントを変更できることです。そのため、一連のサーバーがあり、ユーザーは一度に1つにしかログインできません。 Config.Accountはそのアクティブなアカウントを指し、情報を取得するためにサーバーへの接続をセットアップするために使用されます。私はConfig.Accountがアラートのリストのような情報をクリーンアップするように他のオブジェクトに指示するように変更されたというこの通知を使用しています。基本的には、すべての情報はアカウント単位であるため、新しいアクティブなアカウントで次回の読み込み時に削除してから再設定する必要があります。

また、与えられた名前は私の実際のオブジェクト名ではありません。例を簡単に従わせようとしています。

答えて

7

KVO(Key-Value Observing):Key-Value Observing Programming Guideをご覧ください。これはCocoaでこれを行う標準的な方法であり、優れたCocoaプログラマであることを理解するために必要な基本的な技術です。

KVOは、プロパティが変更されたときに通知する(おそらくaccount、ないAccountに名前を付ける必要があります)を登録Accountプロパティへの変更を気にするオブジェクトをできるようになります。 KVOは標準的なNSManagedObjectsのための "ちょうど"仕事をします。あなたがConfigオブジェクトを呼び出す

  • -addObserver:forKeyPath:options:context:は、観測値が
  • を変更したオブザーバオブジェクトいつに呼び出されます
  • -observeValueForKeyPath:ofObject:change:context:観察を設定するには、次のように

    関連するメソッド

    があります
  • -removeObserver:forKeyPath:あなたは、オブザーバーが変更通知を必要としなくなったときに(オブザーバーの割り当てが解除される前を含めて)電話することを確認する必要があります。

これはすべて、リンクされたドキュメントで詳細に説明されています。 BELOW

EDIT:

アプリケーションについては何も知らず、それはあなたが唯一の保存時に通知されるようにしたいと思う理由を知るのは難しいです。 NSManagedObjectContextはNSManagedObjectContextWillSaveNotificationとNSManagedObjectContextDidSaveNotificationを投稿します。通知のuserInfoには、挿入、更新、および削除されたオブジェクトを含む配列がありますが、通知は個々のプロパティほど細かくはありません。 didSave通知の間で変更されたアカウントを手動で追跡できると思います。あなたの店にたくさんのConfigがあると、それはおそらく非効率になるでしょう。

NSManagedObjectへの変更は即時ですが、管理対象オブジェクトのコンテキストで​​を呼び出すまで永続ストアに保存されません。おそらく、あなたが達成しようとしていることとその理由を正確に説明すれば、私はより良く助けることができます。

+0

これを正しく理解すると、observeValueForKeyPath ...は、アカウントの変更時に呼び出されます。保存されたときだけでなく、呼び出されます。私は店舗にいつ実際に保存されているのかを知りたいと思った方がより具体的であったはずです。また、おそらく私は第2の問題を抱えています。これは、いつ/どのように変更を保存するかを完全に理解していません。 Configのアカウントの値を変更しても、保存されるまでは実際には変更されません。おそらく、変更と保存は2番目のコンテキストで行われ、次にメインのアプリケーションコンテキストにマージされるべきです。これはまだ私にとって新しいものですが、ありがとうございます。 – Brian

+0

私はより多くの情報を追加しました - ありがとうございました。 – Brian

+0

アクティブアカウントが変更されているのではなく、保存時に通知を受けたい理由がわかりません。しかし、アプリケーション内にはConfigオブジェクトが1つしかないので、アプリケーションコントローラ内の変更を追跡したり、最も理にかなっている箇所を追跡したり、管理対象オブジェクトコンテキストのNSManagedObjectContextDidSaveNotificationに通知したりするのは簡単です最後の保存以降に変更されました。 –

関連する問題