Перезагрузить данные 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.

Это теперь обновляет на изменении содержания.

Другие вопросы по тегам