我有一个NSFetchedResultsController
来获取UITableView
的数据。在创建NSFetchedResultsController
期间,我创建了一个NSPredicate
,用外部条件过滤数据。重新获取数据的正确方法是什么?只是把我的__fetchedResultsController
弄清楚并重新创造它似乎有点残酷。
谢谢!
答案 0 :(得分:0)
initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
文档声明:
重要提示:调用此方法后,您不得修改fetchRequest 方法。例如,您不得更改其谓词或排序 排序
因此,当谓词发生变化时,您必须重新创建FRC(并在表视图上调用reloadData
。
修改强>
相同的“NSFetchedResultsController类引用”也指出here:
修改获取请求
您不能简单地更改获取请求 修改结果。如果您想更改获取请求,那么您 必须:
- 如果您使用缓存,请将其删除(使用deleteCacheWithName :)。 通常,如果要更改提取,则不应使用缓存 请求。
- 更改提取请求。
- 调用performFetch:。
醇>
所以我上面的第一个答案可能是错的。如果我理解正确的话:
controller.fetchRequest = newFetchRequest
)。这意味着您不必重新创建FRC本身。
(我希望我现在得到它: - )
答案 1 :(得分:0)
正如我在上面的评论中指出的那样,我想出来了。您需要做的是保存对NSFetchRequest
的引用,并在需要时立即操纵它。第二步,您需要告诉NSFetchedResultsController
再次获取数据。
我通过向默认的NSFetchedResultsController
“堆栈”添加两个新方法来实现此目的:
- (void)configureFetchRequest {
NSObject *myExternalDependency = …;
if (!__fetchRequest) {
__fetchRequest = [[NSFetchRequest alloc] init];
}
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:self.managedObjectContext];
[__fetchRequest setEntity:entity];
NSPredicate *filter = [NSPredicate predicateWithFormat:@"someValue == %@", [myExternalDependency someProperty]];
[__fetchRequest setPredicate:filter];
}
- (void)performFetch {
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
所以我现在基本上做的是在创建__fetchedResultsController
时调用这两个方法(当然我使用__fetchRequest
进行初始化)以及每次外部依赖关系发生变化时。就是这样。