我有一个NSManagedObject
子类,它具有一对多关系和一个在数据模型中设置的fetched属性,以提供该关系中对象的过滤子集。
//School.h
@interface School : NSManagedObject
@property (nonatomic, retain) NSSet *pupils;
@property (nonatomic, retain) NSArray *starPupuils;
@end
//School.m
@implementation School
@dynamic pupils;
@dynamic starPupils;
@end
然后我有一个视图控制器,它监视一个School对象以更改学生然后刷新starPupils数据:
-(void)setSchool:(School *)school
{
…
self.contentArray = [self.school starPupils];
[self.school addObserver:self
forKeyPath:@"pupils"
options:nil
context:nil];
…
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"pupils"])
{
self.contentArray = [self.school starPupils];
}
}
首次访问fetched属性时,这样可以正常工作,但正如预期的那样,starPupils数组会被缓存,并且在添加和删除学生时不会自行更新。
如果更改了目标实体中的对象,则必须重新评估fetched属性以确保它是最新的。您使用
refreshObject:mergeChanges:
手动刷新属性 - 这会导致在下次触发对象故障时再次执行与此属性关联的获取请求。 - Core Data Programming Guide: Relationships and Fetched Properties
我的问题是,我应该从哪里拨打refreshObject:mergeChanges:
?
我已经考虑从代码库中处理添加和删除学生的部分调用它,并且在相同的上下文中工作正常,但通常更改发生在单独的背景上下文中。
此背景上下文将parentContext
设置为我的视图控制器始终处理的mainContext
,因此在保存时,更改会自动合并回mainContext
。我调查了refreshObject:mergeChanges:
以回复NSManagedObjectContextDidSaveNotification
的{{1}},但是在调用时已经进行了更改并且已经触发了KVO内容。
我尝试添加以下内容但最终陷入无限循环:
bgContext
我目前的实施如下:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"pupils"])
{
[self.school.managedObjectContext refreshObject:self.school mergeChanges:YES];
self.contentArray = [self.school starPupils];
}
}
有效,但感觉不是最佳。您对最佳实践有任何更好的建议或参考吗?
答案 0 :(得分:0)
是否可以使用NSManagedObjectContextDidSaveNotification来触发UI更新而根本不使用KVO?