Мое приложение связало основной экран с несколькими сортировками/опциями просмотра ряда данных. В зависимости от того, что выбирает пользователь, я могу перечислить их, например, в алфавитном порядке, N новый, или сгруппированный так или иначе.
Я запустил приложение как Базовое основанное на таблице данных приложение навигации; мой делегат приложения настраивает Базовый Стек данных (неизменный сгенерированный код), дает NSManagedObjectContext
к контроллеру для начального экрана, и это передает его UITableViewController
реализация моего "списка объектов".
Начиная с моих трех других взглядов на те же данные все заканчивают тем, что показали таблицу, перечисляющую данные, я развернул этот класс, чтобы иметь три различных NSFetchedResultsControllers
, каждый с тем UITableViewController
экземпляр как их делегат. Прежде, чем продвинуть этот контроллер представления на стеке, я называю метод для переключения который NSFetchedResultsController
использовать, например.
-(void)configureForMostRecent {
self.activeFetchedResultsController = self.mostRecentResultsController;
}
Теперь я получаю случайные катастрофические отказы от Базовых Данных, например. NSInternalInconsistencyException
и другие подобные вещи. Иногда, я использую приложение, и все прекрасно, другие времена, оно отказывает почти немедленно.
Так, мой инстинкт - то, что мой дизайн является просто Плохой Идеей (TM).
Если я в основном придерживаюсь "Одного UITableViewController
одному NSFetchedResultsController
"вид модели и просто использует другие стили кодирования для сокращения шаблона?
Использование нескольких экземпляров NSFetchedResultsController
- вполне допустимый дизайн, основанный на приведенном вами описании.
Вы пытаетесь использовать один и тот же кеш для каждого из этих экземпляров NSFetchedResultsController
? Вы вызываете -reloadData
в таблице всякий раз, когда переключаетесь на другой NSFetchedResultsController
? Оба они могут вызывать сбой, который вы видите.
Делегат не является проблемой, но не вызов -reloadData
будет убийственным. Методы делегата существуют только для обновления UITableView
при изменении NSFetchedResultsController. Тот факт, что в эти методы делегата передается ссылка на, является намеком на то, что они предназначены для обработки нескольких
экземпляров NSFetchedResultController`, вызывающих их.
Вы можете использовать один контроллер выборки, корректируя предикат выборки и выполняя повторную выборку по мере необходимости.
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
}