2013-07-10 12 views
10

私はKVOを使用してNSManagedObjectの変更を観察しています。私が観察しているNSManagedObjectは、メインキューにあるNSManagedObjectコンテキストの一部です。私は背景(専用キューの同時実行性タイプ)コンテキストでこのオブジェクトを更新して、期待通りに保存された(mergeChangesFromContextDidSaveNotificationで)私のメインキュー・コンテキストへの変更、KVO通知の火をマージmergeChangesFromContextDidSaveNotificationの後のKVO通知

しかし、実際に変更されたキーパスに対してのみ通知が発生し、ではなく、NSManagedObjectのすべてのキーパスについてが通知されると予想しました。私は自分のオブジェクトのすべてのキーパスについてKVO通知を受け取りましたが、それらは変更されませんでした。

これは設計によるのですか、何か間違っていますか?

+0

通知をどのように処理していますか?通知userInfoディクショナリのNSUpdatedObjectsKeyを調べる必要があります。 – random

+0

私はこのメソッドを実装しました: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)オブジェクトの変更:(NSDictionary *)コンテキストの変更:(void *)context; – aloo

+0

変更の辞書を見て、古い値を見て、現在の値から変更されているかどうかを調べることができました。しかし、nsmanagedオブジェクトが与えられたキーパスに対して変更されていない場合、KVO通知を最初に取得するのはなぜですか? – aloo

答えて

3

文書化されていませんが、OS XとiOSの両方で動作が確認されています。セーブは、要素が異なるだけでなくNSManagedObject全体の変更としてカウントされます。あなたは、このサイト、openradar.appspot.comなどのバインディングなどのさまざまな結果についての不満を見つけることができます。この問題は明らかに疑似KVOの発火にも現れますが、まったく驚くべきことではありません。

問題を処理する最も簡単な方法(誰かが苦情を言うまで、ファーストパスのオプションを見つけたばかりの「保存したものすべてを再表示する」の後で最も単純な方法です)は、一般的な保存通知を聞き、それぞれに対して-changedValues更新されたオブジェクトを使用して、特定の更新プログラムを起動するのに興味のあるオブジェクトを選択します。

あなたのユースケースではそれほど効率が悪い場合は、関心のあるすべてのプロパティを変更するための編集スレッドフラグを収集するプロパティのカスタムアクセサ(mogeneratorは大きな助けになります)を作成できます。それを保存後に通知として送信します。

例えば、a professional sports team appはバックグラウンドで解析されたJSONフィードで常に更新されています。 NSManagedObjectsには、{playerStatsChanged、teamStatsChanged、leagueRankingsChanged、yadayadayadaChanged}の構造体にフラグを設定するカスタムアクセサがあります。これは、アプリケーション内のどのページが現在のフェッチで再表示する必要があるかに対応しています-and-parseスレッドが完了しました。それが保存されると、それはそのフラグ設定構造で一般的な「これらの画面を更新する」通知を発します。あなたはおそらく、個々の変更パス通知を、より高いレベルの「この画面を更新する」タイプのロジックに合体させているのではないでしょうか?さて、プロパティセッターレベルでは、ほとんどの合理的な使用例のために、これを行うことができる最も低いオーバーヘッドポイントです。確かにここで私たちのスポーツチームのアプリなどの定期的に取得された更新デザインのために。

+0

この素晴らしい応答をありがとう。これがいくつかの人々によって既知の問題であることを確認するリンク?ちょうど私が間違って何かをしていないことを確認したい。私は古い値が新しい値と異なっているかどうかを確認するためにKVO通知を調べる道を行くつもりです。もしそうなら、UIを更新してください。 – aloo

+0

このオープンレーダーのバグ(http://openradar.appspot.com/6624874)を参照してください。保存されているオブジェクトのKVOを使用すると、ソリューション3と実質的に同じです。 –

+1

また、KVO準拠のドキュメント - http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOCompliance.html - あなたが変更を確認するために特定のコードを記述しない限り、すべてのsetValueに通知すると、デフォルトであると述べています。コアデータチームは、すべての可能なコアデータフィールドタイプについてそれを書いて、オブジェクトに保存されたKVOが望むように動作するのに必要なように、各セーブ時に各オブジェクトのすべてのフィールドに対して適切なコンパレータを呼び出しますか?ナナ、そうじゃないよ。 –

0

あなたがお好みのキーのみのため、手動の通知を自動変更通知を無効にすることができます....アップルのドキュメントには何も表示されません。詳細な文書hereを確認してください。

+0

通知したいキーをハードコードしたくありません。私は、通知が実際にマージ後に変更されたkeypathsのためだけに送信されるようにしたい。現在、変更されていないキーパスの通知を受け取ります。 – aloo

関連する問題