刷新NSManagedObject的获取属性

时间:2012-10-06 19:23:21

标签: cocoa core-data nsmanagedobjectcontext

我有一个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];
    }
}

有效,但感觉不是最佳。您对最佳实践有任何更好的建议或参考吗?

1 个答案:

答案 0 :(得分:0)

是否可以使用NSManagedObjectContextDidSaveNotification来触发UI更新而根本不使用KVO?