gpt4 book ai didi

cocoa - 重新获取 NSFetchedResultsController 有什么作用吗?

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

我有一个获取的结果 Controller ,在我的事物实体上有一个谓词,如下所示:“thingDomain.domainCurrentAccount !=NULL”。它找到当前域中我的所有 Thing 对象。当前域由帐户实体和域实体之一之间的一对一关系定义。每一个事物都属于一个领域,而每个领域又拥有许多事物。除一个域外的所有域都与帐户具有 NULL 关系。

这有效,我的桌面 View 很满意。

后来我通过修改与Account的关系来更改当前域。我将更多事物添加到现在是当前域的域中,它们被添加到 TableView 中,因为它们满足谓词。然而,属于现在非当前域的事物仍然保留在表格 View 中,即使它们不再满足谓词。

我尝试重新获取,但没有效果,所以我很困惑再次获取实际上做了什么。它是否针对实体重新评估谓词?

我通过在更改当前域之前删除当前域中的所有事物解决了这个问题,但我觉得我不应该这样做。

最佳答案

再次执行提取后是否重新加载表格 View ?

这对我有用:

self.fetchedResultsController = nil;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Error in refetch: %@",[error localizedDescription]);
abort();
}

[self.tableView reloadData];

更新
获取的结果 Controller 正在观察事物对象的变化,而不是域对象。由于我们正在更改域对象上的帐户,因此获取的结果 Controller 不会更新(新事物除外)。
理想的解决方案是告诉托管对象上下文或获取的结果 Controller 哪些确切的事物已“更改”(在域中先前拥有帐户的事物上循环),但这仍然是一个手动过程。
另一种方法是再次执行提取并重新加载对我有用的表。

我根据您的描述创建了这个模型:

帐户 <---> 域 <--->> 事物

为了测试这一点,我在域domainOne中创建了事物“一”和“二”,并在域domainTwo中创建了事物“三”、“四”和“五”。 domainOne 有帐户,domainTwo 没有帐户。
当应用程序加载时,表格 View 将按预期显示事物“一”和“二”。
当我点击“更改”时,domainTwo 被分配了帐户,domainOne 失去了其帐户。此外,在domainTwo 中创建了一个名为“Six”的新事物。
事物“六”与“一”和“二”一起出现,即使它们不再满足谓词。这与您描述的问题相符。
然后,我点击“重新获取”,表格将重新加载“三”、“四”、“五”和“六”。这是期望的行为。

这是相关的 View Controller 代码:

- (void)addTestData {
account = [NSEntityDescription insertNewObjectForEntityForName:@"Account" inManagedObjectContext:self.managedObjectContext];
domainOne = [NSEntityDescription insertNewObjectForEntityForName:@"Domain" inManagedObjectContext:self.managedObjectContext];
domainTwo = [NSEntityDescription insertNewObjectForEntityForName:@"Domain" inManagedObjectContext:self.managedObjectContext];
[domainOne setValue:account forKey:@"domainCurrentAccount"];

NSArray *thingNames = [NSArray arrayWithObjects:@"One", @"Two", @"Three", @"Four", @"Five", nil];
for (NSString *name in thingNames) {
NSManagedObject *thing = [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.managedObjectContext];
[thing setValue:name forKey:@"thingName"];
if (name == @"One" || name == @"Two") {
[thing setValue:domainOne forKey:@"thingDomain"];
} else {
[thing setValue:domainTwo forKey:@"thingDomain"];
}
}
}

- (void)change {
[domainTwo setValue:account forKey:@"domainCurrentAccount"];
[domainOne setValue:nil forKey:@"domainCurrentAccount"];
NSManagedObject *thing = [NSEntityDescription insertNewObjectForEntityForName:@"Thing" inManagedObjectContext:self.managedObjectContext];
[thing setValue:@"Six" forKey:@"thingName"];
[thing setValue:domainTwo forKey:@"thingDomain"];
}

- (void)refetch {
self.fetchedResultsController = nil;
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Error in refetch: %@",[error localizedDescription]);
abort();
}

[self.tableView reloadData];
}
- (void)viewDidLoad {
[super viewDidLoad];

UIBarButtonItem *changeButton = [[UIBarButtonItem alloc] initWithTitle:@"Change" style:UIBarButtonItemStyleBordered target:self action:@selector(change)];
self.navigationItem.leftBarButtonItem = changeButton;
[changeButton release];

UIBarButtonItem *refetchButton = [[UIBarButtonItem alloc] initWithTitle:@"Refetch" style:UIBarButtonItemStyleBordered target:self action:@selector(refetch)];
self.navigationItem.rightBarButtonItem = refetchButton;
[refetchButton release];

[self addTestData];

NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}

关于cocoa - 重新获取 NSFetchedResultsController 有什么作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1774743/

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