У меня есть 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 делает правильные вещи:
- (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 приносит много полезных полезностей (например, кеширование, частичная загрузка ...). До сих пор остается вопрос: как «переключать» данные в UITableView, поддерживаемом NSFetchedResultsController, где «переключатель» означает наличие другого предиката или даже (не в моем случае) другого объекта.
Заметьте, ради полноты, что поскольку упорядочено отношение «многие ко многим» из «Выделения в документ», оно обрабатывается через промежуточную легковесную сущность под названием DocInSelection, которая имеет свойство «упорядочения» и два множества. отношения один к одному с документом и выбором.
Спасибо за любые предложения.