Parent
と呼ばれる一時的な派生 (読み取り専用) プロパティを持つカスタム クラスを持つエンティティがありますDerivedProperty
。
の値は の値にDerivedProperty
依存するParent.IndependentProperty1
ためIndependentProperty1
、変化すると の値もDerivedProperty
変化します。ただし、は( と呼ばれる) とParent
対多関係にあり、すべての のオブジェクトのの値にも依存しています。Child
children
DerivedProperty
IndependentProperty2
Parent
Child
そのため、オブジェクトが変更されるたびIndependentProperty1
に、Parent
変更されたオブザーバーにも通知したいと思います。IndependentProperty2
Child
DerivedProperty
これまでのところ、次のコードに到達しました。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 通知を取得するにはどうすればよいですか?