У меня есть UITableViewController, который является подклассом CoreDataTableViewController
(это Stanford class). Это реализует fetchedResultsController
.Обновить данные UITableView при каждом изменении контекста?
Теперь в моем viewWillAppear
, у меня есть это:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if(!self.managedObjectContext) {
[self useManagedDocument];
}
}
Он инициализирует managedObjectContext
, если у меня нет, и получает его от вспомогательного класса. В MOC сеттера, я инициализировать fetchedResultsController
:
- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext
{
_managedObjectContext = managedObjectContext;
if(self.managedObjectContext) {
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:CD_ITEM_ENTITY_NAME];
request.sortDescriptors = @[[NSSortDescriptor
sortDescriptorWithKey:CD_ITEM_NAME_PROPERTY
ascending:YES
selector:@selector(localizedCaseInsensitiveCompare:)]];
request.predicate = nil;
self.fetchedResultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:request
managedObjectContext:self.managedObjectContext
sectionNameKeyPath:nil
cacheName:nil];
} else {
self.fetchedResultsController = nil;
}
}
Когда начинается моя программа, она загружает данные таблицы правильно и мой отладчик говорит, что запрос был сделан выборки. Однако, после вставки данных в моем графике Ядро данных, и сохранение, он говорит, что контекстные изменения и пожары этот метод делегата:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
/*NSError *error;
[controller performFetch:&error];
if(error) {
NSLog(@"%@", error);
}
[self.tableView reloadData];*/
}
Я заметил это, потому что он не работает. В основном, что я хочу сделать, это перезагрузить данные каждый раз, когда изменяется контекст. Если я добавлю элемент в другой контроллер представления, а затем вернусь к нему, он также должен перезагрузить.
Как это реализовать? Я попытался сделать performFetch
в этом методе делегата, и он ввел его (я проверил, установив точку останова внутри), но performFetch
ничего не сделал, и моя таблица не была перезагружена.
Когда я добавить элемент в модальном VC (другой у меня есть для управления объектами), это то, что происходит в моем регистраторе:
2013-05-10 22:41:38.264 App1[7742:c07] [ItemCDTVC performFetch] fetching all Item (i.e., no predicate)
2013-05-10 22:41:46.454 App1[7742:c07] NSManagedObjects did change.
2013-05-10 22:41:46.456 App1[7742:c07] NSManagedContext did save.
Когда я закрываю мое приложение, но не бросить его из многозадачности бар, а затем снова открыть его, он ничего не делает. Нет выборки. Ну, если контекст не изменился, я не хочу, чтобы он запускал запрос, но представьте, добавляет ли пользователь элемент в другой ViewController, а затем возвращается к моему ItemCDTVC, в котором перечислены все элементы. Получает ли это уведомление об изменении контекста, чтобы он мог вызвать метод делегата для обновления таблицы, или мне всегда нужно обновлять, независимо от изменений в моем viewWillAppear
? В настоящее время у меня он настроен делать это только один раз, при загрузке приложения.