Parentと呼ばれる一時的な派生 (読み取り専用) プロパティを持つカスタム クラスを持つエンティティがありますDerivedProperty。
の値は の値にDerivedProperty依存するParent.IndependentProperty1ためIndependentProperty1、変化すると の値もDerivedProperty変化します。ただし、は( と呼ばれる) とParent対多関係にあり、すべての のオブジェクトのの値にも依存しています。ChildchildrenDerivedPropertyIndependentProperty2ParentChild
そのため、オブジェクトが変更されるたびIndependentProperty1に、Parent変更されたオブザーバーにも通知したいと思います。IndependentProperty2ChildDerivedProperty
これまでのところ、次のコードに到達しました。DerivedProperty唯一の問題は、これを実行しようとするとobjectContextDidChange:コードがループしてしまうため、KVO 通知が発行されないことです。
- (void) awakeFromInsert
{
[super awakeFromInsert];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectContextDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
}
- (void) awakeFromFetch
{
[super awakeFromFetch];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(objectContextDidChange:) name:NSManagedObjectContextObjectsDidChangeNotification object:self.managedObjectContext];
}
- (void) objectContextDidChange: (NSNotification *) notification
{
NSSet *updatedObjects = [[notification userInfo] objectForKey:NSUpdatedObjectsKey];
if ([updatedObjects containsObject:self] || [updatedObjects intersectsSet:self.children])
{
//clear caches
_derivedProperty = nil;
}
}
- (void) didTurnIntoFault
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (NSString *) DerivedProperty
{
if (_derivedProperty == nil)
{
_derivedProperty = [self someExpensiveCalculation];
}
return _derivedProperty ;
}
ここでのアプローチを完全に再考する必要があると確信しています。KVO を使用して対多関係を観察しようとしましたIndependentProperty1がIndependentProperty2、正しく機能していないようです。派生プロパティが対多関係に依存していない場合は、それをそのまま使用できると確信していますkeyPathsForValuesAffectingValueForKey:が、もちろんそれは対多関係では機能しません。
対多関係に依存するコア データの一時的な派生プロパティで動作する KVO 通知を取得するにはどうすればよいですか?