Перезагрузить данные UITableView каждый раз, когда меняется контекст?
У меня есть UITableViewController, который является подклассом CoreDataTableViewController
(это Стэнфордский класс). Это реализует fetchedResultsController
,
Теперь по моему 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
? В настоящее время у меня настроено делать это только один раз, при загрузке приложения.
1 ответ
Исправлено, все, что мне нужно было сделать, это поместить один вкладыш в метод делегата:
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.tableView endUpdates];
}
Это завершает обновления, вставки, удаления и изменения, внесенные в таблицу (по сути, обновляя мое представление) так же, как в документации Apple.
Это теперь обновляет на изменении содержания.