我有一个NSFetchedResultsController
要获取的数据UITableView
。在创建过程中,NSFetchedResultsController
我创建了一个NSPredicate
使用外部条件过滤数据的方法。重新获取数据的正确方法是什么?只是取消 my__fetchedResultsController
并重新创建它似乎有点残酷。
谢谢!
我有一个NSFetchedResultsController
要获取的数据UITableView
。在创建过程中,NSFetchedResultsController
我创建了一个NSPredicate
使用外部条件过滤数据的方法。重新获取数据的正确方法是什么?只是取消 my__fetchedResultsController
并重新创建它似乎有点残酷。
谢谢!
该initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
文档指出:
重要提示:调用此方法后不得修改 fetchRequest。例如,您不得更改其谓词或排序顺序。
reloadData
因此,当谓词更改时,您必须重新创建 FRC(并调用表视图)。
编辑:
同样的“NSFetchedResultsController 类参考”也在这里声明:
修改获取请求
您不能简单地更改获取请求来修改结果。如果要更改获取请求,则必须:
- 如果您正在使用缓存,请将其删除(使用 deleteCacheWithName:)。如果要更改获取请求,通常不应使用缓存。
- 更改获取请求。
- 调用 performFetch:。
所以我上面的第一个答案可能是错误的。如果我理解正确:
controller.fetchRequest = newFetchRequest
这意味着您不必重新创建 FRC 本身。
(我希望我现在明白了 :-)
正如我在上面的评论中指出的那样,我想通了。您需要做的是保存对 的引用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
)以及每次我的外部依赖项发生变化时。就是这样。