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