Arhn - архитектура программирования

CoreData: перезагрузить данные перед возвратом в UITableView

Я знаю, что основные данные очень сильно привязаны к UITableViewController, однако у меня есть приложение с двумя страницами, на которых вы можете обновлять данные, было бы здорово, если бы я мог видеть обновленные значения, отраженные в соответствующих метках каждой страницы, без необходимости возврата в UITableViewController и с помощью tableView.reloadData(). Есть ли способ добиться этого? Спасибо

РЕДАКТИРОВАТЬ: я добавил диаграмму, которая, надеюсь, немного прояснит мой вопрос. Я хотел бы внести обновления в управляемый объект в представлении D, который, как я могу подтвердить (через println), уже работает должным образом, однако, когда я использую poptoViewController C, ничего не изменилось, и я вижу устаревшую информацию. Только когда я возвращаюсь к A, табличному представлению, изменения объекта становятся очевидными в пользовательском интерфейсе. Итак, есть ли способ перезагрузить объект в представлении C, не возвращаясь к A?

РЕДАКТИРОВАТЬ № 2: после прочтения ответов ниже (спасибо!), я думаю, что мой вопрос сводится к Как я могу реализовать функциональность NSFetchedResultsController на ViewController, у которого нет UITableView?

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

06.03.2015

  • Почему использование reloadData() является проблемой? Можете ли вы объяснить немного больше, как выглядит ваше приложение? 06.03.2015
  • Данные содержатся в источнике данных, которым управляет ваш объект UITableViewDataSource. Тот факт, что он может поддерживаться или не поддерживаться CoreData, не имеет значения. При изменении источника данных необходимо выполнить reloadData (или одну из других reload... операций), чтобы TableView знал, что данные изменились. 06.03.2015

Ответы:


1

NSFetchedResultsController предоставляет вам эту функциональность практически бесплатно. Реализуйте NSFetchedResultsControllerDelegate и установите frc.delegate = self. При внесении изменений в Core Data будут вызываться соответствующие методы делегата.

Приведенный ниже код является шаблоном из шаблона iOS Master/Detail Core Data, который Xcode настраивает для вас. Чтобы получить копию всего этого, перейдите в меню «Файл» -> «Создать» -> «Проект» -> «Приложение Master-Detail» -> затем установите флажок «Использовать базовые данные».

Свифт

func controllerWillChangeContent(controller: NSFetchedResultsController) {
    self.tableView.beginUpdates()
}

func controller(controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType) {
    switch type {
        case .Insert:
            self.tableView.insertSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
        case .Delete:
            self.tableView.deleteSections(NSIndexSet(index: sectionIndex), withRowAnimation: .Fade)
        default:
            return
    }
}

func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) {
    switch type {
        case .Insert:
            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
        case .Delete:
            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
        case .Update:
            self.configureCell(tableView.cellForRowAtIndexPath(indexPath!)!, atIndexPath: indexPath!)
        case .Move:
            tableView.deleteRowsAtIndexPaths([indexPath!], withRowAnimation: .Fade)
            tableView.insertRowsAtIndexPaths([newIndexPath!], withRowAnimation: .Fade)
        default:
            return
    }
}

func controllerDidChangeContent(controller: NSFetchedResultsController) {
    self.tableView.endUpdates()
}

Цель-C

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

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    switch(type) {
        case NSFetchedResultsChangeInsert:
            [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        default:
            return;
    }
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath
{
    UITableView *tableView = self.tableView;

    switch(type) {
        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}

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

2

на ваш вопрос:

Как я могу реализовать функциональность NSFetchedResultsController в ViewController, у которого нет UITableView?

Ваш ViewController должен подписаться на уведомление NSManagedObjectContextDidSaveNotification. Посмотрите на userInfo уведомления и обработайте ключи updatedObjects, insertedObjects и deletedObjects. Когда какой-либо из объектов представляет интерес для вашего ViewController, обновите представление.

Вот пример

06.03.2015
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..