0

У меня есть 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? В настоящее время у меня он настроен делать это только один раз, при загрузке приложения.

ответ

0

Fixed, все, что я должен был сделать, это положить один вкладыш в этом методе делегата:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView endUpdates]; 
} 

Это заканчивается обновления, вставки, удаления, и изменения, внесенные в таблицу (освежающие мой взгляд, по существу) аналогично Apple's documentation.

Теперь он обновляется при изменении контента.

Смежные вопросы