Один UITableViewController со многими NSFetchedResultsControllers - плохая идея?

Мое приложение связало основной экран с несколькими сортировками/опциями просмотра ряда данных. В зависимости от того, что выбирает пользователь, я могу перечислить их, например, в алфавитном порядке, N новый, или сгруппированный так или иначе.

Я запустил приложение как Базовое основанное на таблице данных приложение навигации; мой делегат приложения настраивает Базовый Стек данных (неизменный сгенерированный код), дает NSManagedObjectContext к контроллеру для начального экрана, и это передает его UITableViewController реализация моего "списка объектов".

Начиная с моих трех других взглядов на те же данные все заканчивают тем, что показали таблицу, перечисляющую данные, я развернул этот класс, чтобы иметь три различных NSFetchedResultsControllers, каждый с тем UITableViewController экземпляр как их делегат. Прежде, чем продвинуть этот контроллер представления на стеке, я называю метод для переключения который NSFetchedResultsController использовать, например.

-(void)configureForMostRecent {
  self.activeFetchedResultsController = self.mostRecentResultsController;
}

Теперь я получаю случайные катастрофические отказы от Базовых Данных, например. NSInternalInconsistencyException и другие подобные вещи. Иногда, я использую приложение, и все прекрасно, другие времена, оно отказывает почти немедленно.

Так, мой инстинкт - то, что мой дизайн является просто Плохой Идеей (TM).

Если я в основном придерживаюсь "Одного UITableViewController одному NSFetchedResultsController"вид модели и просто использует другие стили кодирования для сокращения шаблона?

1
задан davetron5000 6 July 2010 в 23:46
поделиться

2 ответа

Использование нескольких экземпляров NSFetchedResultsController - вполне допустимый дизайн, основанный на приведенном вами описании.

Вы пытаетесь использовать один и тот же кеш для каждого из этих экземпляров NSFetchedResultsController ? Вы вызываете -reloadData в таблице всякий раз, когда переключаетесь на другой NSFetchedResultsController ? Оба они могут вызывать сбой, который вы видите.

Обновление

Делегат не является проблемой, но не вызов -reloadData будет убийственным. Методы делегата существуют только для обновления UITableView при изменении NSFetchedResultsController. Тот факт, что в эти методы делегата передается ссылка на, является намеком на то, что они предназначены для обработки нескольких экземпляров NSFetchedResultController`, вызывающих их.

1
ответ дан 2 September 2019 в 23:14
поделиться

Вы можете использовать один контроллер выборки, корректируя предикат выборки и выполняя повторную выборку по мере необходимости.

EDIT

Следуя моему примеру:

[NSFetchedResultsController deleteCacheWithName:@"MyObjectsCache"];
NSPredicate *_predicate = nil;
if (condition) {
    _predicate = [NSPredicate predicateWithFormat:mySearchPredicateString];
    self.currentTableView = searchDisplayController.searchResultsTableView;
}
else {
    _predicate = [NSPredicate predicateWithFormat:myDefaultPredicateString];
    self.currentTableView = tableView;
}

[fetchedResultsController.fetchRequest setPredicate:_predicate];

NSError *_error = nil;
if (![fetchedResultsController performFetch:&_error]) {
    // handle error 
}
1
ответ дан 2 September 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: