の特定の属性に対する変更を検出するにはどうすればよいNSManagedObjectですか? Core Data データ モデルには、Product販売する製品を表すエンティティがあります。Productエンティティにはprice、sku、weight、numberInStock、 などのいくつかの属性があります。 の属性が変更されるたびに、price長いProduct計算を実行する必要があります。したがって、その変更が別のスレッドに保存されたコンテキストのマージに起因する場合でも、[編集]priceの属性がいつ Product変更されるかを知りたいです。これを行うための良い方法は何ですか? 私のストアには何千ものオブジェクトがあります。明らかに、それぞれにメッセージを送ることは現実的ではありません。ProductaddObserver
変更を検出するために使用していますが、管理対象オブジェクトが変更されたことをNSManagedObjectContextObjectsDidChangeNotification通知するだけで、そのオブジェクトのどの属性が変更されたかは通知されません。に変更があるたびに計算をやり直すことができますが、無関係な属性が変更されるたびに無駄な再計算が行われます。エンティティ(属性のみを含む)を作成し、との間の対1関係を使用することを検討しています。このようにして、計算を開始するためにオブジェクトの変更を検出できます。これは私には過度に不器用に思えます。より良い方法はありますか?ProductPricepriceProductPricePrice
アップデート:
changedValues@railwayparade は、 のメソッドを使用しNSManagedObjectて、更新されたオブジェクトごとに変更されたプロパティを特定できることを指摘しました。私はその方法を完全に見逃していました。変更がバックグラウンド スレッドで行われておらず、メイン スレッドのコンテキストにマージされていなければ、問題は完全に解決されます。(次の段落を参照してください。)
NSManagedObjectContextObjectsDidChangeNotification私はその仕組みについての微妙な点を完全に見逃していました。私が知る限り、別のスレッドに保存されたマネージド オブジェクト コンテキストが (を使用してmergeChangesFromContextDidSaveNotification:) メイン スレッドのコンテキストにマージされると、結果には現在メイン スレッドのマネージド オブジェクト コンテキストにあるオブジェクトに関する変更情報NSManagedObjectContextObjectsDidChangeNotification のみが含まれます。変更されたオブジェクトがメイン スレッドのコンテキストにない場合、それは通知の一部にはなりません。それは理にかなっていますが、私が予想していたものではありませんでした。したがって、より詳細な変更情報を取得するために属性の代わりに対 1 関係を使用するという私の考えでは、実際にはNSManagedObjectContextDidSaveNotificationメイン スレッドではなく、バックグラウンド スレッドの を調べる必要がありますNSManagedObjectContextObjectsDidChangeNotification。もちろん、単に次のchangedValues方法を使用する方がはるかに賢明です。NSManagedObject@railwayparade が有益に指摘したように。ただし、メイン スレッドでのマージからの変更通知に、バックグラウンド スレッドで行われたすべての変更が含まれているとは限らないという問題がまだ残っています。