我正在一个屏幕上编写一个带有两个表的应用程序。左表是文件夹列表,右表显示文件列表。当点击左侧的一行时,右侧表格将显示属于该文件夹的文件。
我正在使用Core Data进行存储。当文件夹的选择发生变化时,右表NSFetchedResultsController的fetch谓词将改变并执行新的提取,然后重新加载表数据。我使用了以下代码片段:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list];
[fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
[table reloadData];
然而,获取结果仍然相同。我在获取之前和之后都有NSLog'ed“谓词”,并且它们对于更新的信息是正确的。获取结果与初始提取保持一致(加载视图时)。
我不太熟悉Core Data获取对象的方式(有缓存系统吗?),但我之前用单表视图做过类似的事情(更改谓词,重新获取数据和刷新表)一切顺利。
如果有人能给我一个提示,我将非常感激。
提前致谢。
答案 0 :(得分:56)
我几乎已经遇到了这个问题,直到我在iphone incubator
的最新博客文章中找到了提示。NSFetchedResultsController正在缓存第一个结果。 (你可能在initWithFetchRequest中设置了一些东西:managedObjectContext:sectionNameKeyPath:cacheName)
我猜你的代码(比如我的)是CoreData示例的派生,所以假设它是@“Root”,在你更改谓词之前,做一个
[NSFetchedResultsController deleteCacheWithName:@"Root"];
答案 1 :(得分:1)
就我而言,deafgreatdane的答案是行不通的;我做的事情可能是天真的,但有效:
configureCell:atIndexPath:
方法中创建相应的谓词(在tableView:cellForRowAtIndexPath:
中调用)[_fetchedResultsController.fetchRequest setPredicate:predicate];
[_fetchedResultsController performFetch:nil];
[self.fetchedResultsController objectAtIndexPath:indexPath]
答案 2 :(得分:1)
这对我有用:
[NSFetchedResultsController deleteCacheWithName:nil];
[self.fetchedResultsController.fetchRequest setPredicate:predicate];
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error]) {
NSLog(@"%@, %@", error, [error userInfo]);
abort();
}
答案 3 :(得分:1)
在我的快速项目中遇到了类似的问题。这对我有用
NSFetchedResultsController.deleteCache(withName: fetchedResultsController.cacheName)