【发布时间】:2013-05-20 05:47:30
【问题描述】:
我有一个 Parent 实体,该实体具有一个自定义类,该类具有一个名为 DerivedProperty 的瞬态和派生(只读)属性。
DerivedProperty 的值取决于Parent.IndependentProperty1 的值,因此每当IndependentProperty1 更改时,DerivedProperty 的值也会更改。但是,Parent 与Child(称为children)具有一对多关系,并且DerivedProperty 还依赖于IndependentProperty2 在所有Parent 的Child 对象中的值。
因此,每当Parent 的IndependentProperty1 或IndependentProperty2 的任何Child 对象发生变化时,我想通知任何观察者DerivedProperty 也发生了变化。
到目前为止,我已经获得了以下代码。唯一的问题是没有为DerivedProperty 发出KVO 通知,因为如果我尝试在objectContextDidChange: 中执行此操作,那么代码将最终进入循环。
- (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:,但当然这不适用于一对多关系。
如何使用依赖于一对多关系的 Core Data 瞬态派生属性获得 KVO 通知?
【问题讨论】:
-
我目前无法对此进行测试,但是反过来如何工作:Children 实体的
IndependentProperty2的setter 函数调用其父级上的一个方法,该方法计算并设置DerivedProperty? -
这可行,但与我的域模型不匹配。
Child对象不应该对他们的Parent有任何了解,从不负责更新它。不过我可能最终不得不走这条路。
标签: ios cocoa-touch core-data key-value-observing