[英]NSFetchedResultsController, refetch data with external condition
我有一个NSFetchedResultsController
来获取UITableView
的数据。 在创建中的NSFetchedResultsController
创建一个NSPredicate
与外部条件对数据进行过滤。 重新获取数据的正确方法是什么? 只是取消我的__fetchedResultsController
并重新创建它似乎有点残酷。
谢谢!
initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName:
文档指出:
重要说明:调用此方法后,一定不能修改fetchRequest。 例如,您不得更改其谓词或排序顺序。
因此,当谓词更改时,您必须重新创建FRC(并在表视图上调用reloadData
)。
编辑:
相同的“ NSFetchedResultsController类引用”也在此处指出:
修改提取请求
您不能简单地更改获取请求以修改结果。 如果要更改获取请求,则必须:
- 如果使用缓存,请删除它(使用deleteCacheWithName :)。 通常,如果要更改获取请求,则不应使用缓存。
- 更改获取请求。
- 调用performFetch:。
所以我上面的第一个答案可能是错误的。 如果我正确理解:
controller.fetchRequest = newFetchRequest
)。 这意味着您不必重新创建FRC本身。
(我希望我现在就知道了:-)
正如我在上面的评论中指出的那样,我已经解决了。 您需要做的是保存对NSFetchRequest
的引用,并在需要时立即对其进行操作。 第二步,您需要告诉NSFetchedResultsController
再次获取其数据。
我通过向默认的NSFetchedResultsController
“ stack”添加两个新方法来做到这一点:
- (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
进行初始化)以及每次外部依赖项更改时都调用这两个方法。 而已。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.