我有一个 UITableView 显示大量名为“文档”的实体的子集。该子集由另一个实体“选择”定义。选择是命名的、有序的文档列表。
它工作正常,除非我想在运行时更改显示的选择。我只得到一个空白列表。
基本上,我需要更改我的 NSFetchedResultsController 持有的谓词,以便新的谓词使用另一个选择。我无法让它工作。我最后一次尝试是完全摆脱 NSFetchedResultsController 并重新分配它:
- (void) displaySelection:(Selection *)aSet
{
self.currentSelection = aSet;
self.fetchedResultsController = nil;
// methods here don't all use the property but directly the ivar, so we must trigger the getter
[self fetchedResultsController];
[self.tableView reloadData];
}
当然,NSFetchedResultsController getter 做了正确的事:
- (NSFetchedResultsController *)fetchedResultsController
{
if (fetchedResultsController != nil) { return fetchedResultsController; }
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"DocInSelection" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selection.identifier like %@", currentSelection.identifier];
[fetchRequest setPredicate:predicate];
<snip>
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;
<snip>
return fetchedResultsController;
}
此代码第一次工作,因为设置了初始选择。但是,当displaySelection:
被调用时,表格视图变为空白。
在NSFetchedResultsController 获取请求中提出了一个非常相似的问题- 更新谓词和 UITableView
答案是摆脱 NSFetchedResultsController。我不想这样做,因为 NSFetchedResultsController 在这里带来了很多有用的东西(例如缓存、部分加载......)。问题仍然存在:如何在由 NSFetchedResultsController 支持的 UITableView 中“切换”数据,其中“切换”意味着具有不同的谓词,甚至(在我的情况下不是)不同的实体。
请注意,为了完整起见,由于从 Selection 到 Document 的多对多关系是有序的,因此它是通过称为 DocInSelection 的中间轻量级实体处理的,该实体具有“排序”属性和两个多对一与文档和选择的关系。
感谢您的任何建议。