gpt4 book ai didi

cocoa - 刷新获取的NSManagedObject属性

转载 作者:行者123 更新时间:2023-12-03 16:47:03 24 4
gpt4 key购买 nike

我有一个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数组被缓存并且在添加和删除瞳孔时不会自我更新,这可以很好地工作。


  如果目标实体中的对象已更改,则必须重新评估获取的属性以确保它是最新的。您使用 refreshObject:mergeChanges:手动刷新属性-这将导致在下次触发对象故障时再次执行与此属性关联的获取请求。 — Core Data Programming Guide: Relationships and Fetched Properties


我的问题是,我应该从哪里打电话给 refreshObject:mergeChanges:

我研究过从代码库中处理瞳孔添加和删除的部分中调用它,并且在相同的上下文中可以很好地工作,但是更改通常是在单独的背景上下文中进行的。

此背景上下文将其 parentContext设置为我的视图控制器始终处理的 mainContext,因此保存时,更改将自动合并回 mainContext。我考虑响应 refreshObject:mergeChanges:NSManagedObjectContextDidSaveNotification调用 bgContext,但是到所谓的时间为止,已经进行了更改,并且已经触发了KVO。

我尝试添加以下内容,但最终陷入无限循环:

-(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];
}
}


我当前的实现如下:

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"pupils"])
{
if (self.contentArray == [self.school starPupils])
{
/*
self.contentArray is currently pointing at previous fetched starPupils
we need to reset the object to a faulted state
this will twigger another KVO notification for @"pupils" but the code within this if statement will not be executed again
*/
[self.school.managedObjectContext refreshObject:self.school mergeChanges:YES];
self.contentArray = [self.school starPupils];
}
}
}


可行,但感觉并不理想。您是否有更好的建议或最佳实践参考?

最佳答案

是否可以使用NSManagedObjectContextDidSaveNotification来触发UI更新并且完全不使用KVO?

关于cocoa - 刷新获取的NSManagedObject属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12763053/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com