Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека Разработчика iOS

Разработчик

Ссылка платформы CoreData ссылка на протокол NSFetchedResultsControllerDelegate

Опции
Развертывание Target:

На этой странице
Язык:

NSFetchedResultsControllerDelegate

Наследование


Не применимый

Соответствует


Не применимый

Оператор импорта


Swift

import CoreData

Objective C

@import CoreData;

Доступность


Доступный в iOS 4.0 и позже.

Экземпляр NSFetchedResultsController методы использования в этом протоколе, чтобы уведомить его делегата, что результаты выборки контроллера были изменены вследствие добавления, удалите, переместите или обновите операции.

Необходимо рассмотреть тщательно, хотите ли Вы обновить табличное представление, поскольку внесено каждое изменение. Если большое количество модификаций сделано одновременно — например, при чтении данных из фонового потока — может быть в вычислительном отношении дорого анимировать все изменения. Вместо того, чтобы реагировать на изменения индивидуально (как проиллюстрировано в Типичном Использовании), Вы могли просто реализовать controllerDidChangeContent: (который отправляется делегату, когда все незаконченные изменения были обработаны) перезагружать табличное представление.

Выбранный контроллер результатов сообщает об изменениях в своем разделе перед изменениями в самих выбранных объектах.

Типичное использование

Можно использовать controllerWillChangeContent: и controllerDidChangeContent: к обновлениям скобки к табличному представлению, содержание которого предоставлено выбранным контроллером результатов, как проиллюстрировано в следующем примере:

  • /*
  • Assume self has a property 'tableView' -- as is the case for an instance of a UITableViewController
  • subclass -- and a method configureCell:atIndexPath: which updates the contents of a given cell
  • with information from a managed object at the given index path in the fetched results controller.
  • */
  • - (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;
  • }
  • }
  • - (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:[NSArray arrayWithObject:newIndexPath]
  • withRowAnimation:UITableViewRowAnimationFade];
  • break;
  • case NSFetchedResultsChangeDelete:
  • [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
  • withRowAnimation:UITableViewRowAnimationFade];
  • break;
  • case NSFetchedResultsChangeUpdate:
  • [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
  • atIndexPath:indexPath];
  • break;
  • case NSFetchedResultsChangeMove:
  • [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
  • withRowAnimation:UITableViewRowAnimationFade];
  • [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
  • withRowAnimation:UITableViewRowAnimationFade];
  • break;
  • }
  • }
  • - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
  • [self.tableView endUpdates];
  • }

Управляемые пользователями обновления

В целом, NSFetchedResultsController разработан для реакции на изменения на уровне модели. Если Вы позволяете пользователю переупорядочивать строки таблицы, то Ваша реализация методов делегата должна принять это во внимание.

Как правило, если Вы позволяете пользователю переупорядочивать строки таблицы, Ваш объект модели имеет атрибут, указывающий его индекс. Когда пользователь перемещает строку, Вы обновляете этот атрибут соответственно. Это, однако, имеет побочный эффект того, чтобы заставлять контроллер заметить изменение, и тем самым сообщить его делегату об обновлении (использование controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:). Если Вы просто используете реализацию этого метода, показанного в Типичном Использовании, то делегат пытается обновить табличное представление. Табличное представление, однако, уже находится в надлежащем состоянии из-за действия пользователя.

В целом, если перемещение инициируется пользователем, поэтому при поддержке управляемых пользователями обновлений необходимо установить флаг. В реализации Ваших методов делегата, если флаг установлен, Вы обходите реализации основного метода; например:

  • - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
  • atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
  • newIndexPath:(NSIndexPath *)newIndexPath {
  • if (!changeIsUserDriven) {
  • UITableView *tableView = self.tableView;
  • // Implementation continues...
  • Уведомляет получатель, что выбранный контроллер результатов собирается начать обрабатывать одного или более изменений вследствие добавления, удалять, переместитесь, или обновление.

    Объявление

    Swift

    optional func controllerWillChangeContent(_ controller: NSFetchedResultsController)

    Objective C

    - (void)controllerWillChangeContent:(NSFetchedResultsController *)controller

    Параметры

    controller

    Выбранный контроллер результатов, отправивший сообщение.

    Обсуждение

    Этот метод вызывается перед всеми вызовами controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: и controller:didChangeSection:atIndex:forChangeType: были отправлены за данным событием изменения (таким как контроллер, получающий a NSManagedObjectContextDidSaveNotification уведомление).

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.

  • Уведомляет получатель, что выбранный объект был изменен вследствие добавления, удалите, переместитесь, или обновление.

    Объявление

    Swift

    optional func controller(_ controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath newIndexPath: NSIndexPath?)

    Objective C

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath

    Параметры

    controller

    Выбранный контроллер результатов, отправивший сообщение.

    anObject

    Объект в изменившихся выбранных результатах контроллера.

    indexPath

    Индексный путь измененного объекта (это значение nil для вставок).

    type

    Тип изменения. Поскольку допустимые значения видят NSFetchedResultsChangeType.

    newIndexPath

    Целевой путь для объекта для вставок или перемещений (это значение nil для удаления).

    Обсуждение

    Выбранный контроллер результатов сообщает об изменениях в своем разделе перед изменениями в объектах результата выборки.

    Об изменениях сообщают со следующей эвристикой:

    • На добавляют и удаляют операции, только добавил/удалил, что сообщают об объекте.

      Предполагается, что все объекты, прибывающие после задействованного объекта, также перемещены, но не сообщают об этих перемещениях. 

    • Когда измененный атрибут на объекте является одним из дескрипторов вида, используемых в запросе выборки, о перемещении сообщают.

      Обновление объекта принято в этом случае, но никакое отдельное сообщение обновления не отправляется делегату.

    • Об обновлении сообщают, когда изменения состояния объекта, но измененные атрибуты не являются частью ключей сортировки. 

    Специальные замечания

    Этот метод может быть вызван много раз во время события обновления (например, если Вы импортируете данные по фоновому потоку и добавляете их к контексту в пакете). Необходимо рассмотреть тщательно, хотите ли Вы обновить табличное представление по получении каждого сообщения.

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.

  • Уведомляет получатель относительно дополнения или удаления раздела.

    Объявление

    Swift

    optional func controller(_ controller: NSFetchedResultsController, didChangeSection sectionInfo: NSFetchedResultsSectionInfo, atIndex sectionIndex: Int, forChangeType type: NSFetchedResultsChangeType)

    Objective C

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id<NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type

    Параметры

    controller

    Выбранный контроллер результатов, отправивший сообщение.

    sectionInfo

    Изменившийся раздел.

    sectionIndex

    Индекс измененного раздела.

    type

    Тип изменения (вставляют или удаляют). Допустимые значения NSFetchedResultsChangeInsert и NSFetchedResultsChangeDelete.

    Обсуждение

    Выбранный контроллер результатов сообщает об изменениях в своем разделе перед изменениями в выбранных объектах результата.

    Специальные замечания

    Этот метод может быть вызван много раз во время события обновления (например, если Вы импортируете данные по фоновому потоку и добавляете их к контексту в пакете). Необходимо рассмотреть тщательно, хотите ли Вы обновить табличное представление по получении каждого сообщения.

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.

  • Уведомляет получатель, что выбранный контроллер результатов завершил обработку одного или более изменений вследствие добавления, удалите, переместитесь, или обновление.

    Объявление

    Swift

    optional func controllerDidChangeContent(_ controller: NSFetchedResultsController)

    Objective C

    - (void)controllerDidChangeContent:(NSFetchedResultsController *)controller

    Параметры

    controller

    Выбранный контроллер результатов, отправивший сообщение.

    Обсуждение

    Этот метод вызывается после всех вызовов controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: и controller:didChangeSection:atIndex:forChangeType: были отправлены за данным событием изменения (таким как контроллер, получающий a NSManagedObjectContextDidSaveNotification уведомление).

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.

  • Возвращает имя для данного раздела.

    Объявление

    Swift

    optional func controller(_ controller: NSFetchedResultsController, sectionIndexTitleForSectionName sectionName: String?) -> String?

    Objective C

    - (NSString *)controller:(NSFetchedResultsController *)controller sectionIndexTitleForSectionName:(NSString *)sectionName

    Параметры

    controller

    Выбранный контроллер результатов, отправивший сообщение.

    sectionName

    Имя по умолчанию раздела.

    Возвращаемое значение

    Строка для использования в качестве имени для указанного раздела.

    Обсуждение

    Этот метод не включает отслеживание изменений. Если индекс раздела используется, только необходимо.

    Если делегат не реализует этот метод, реализация по умолчанию возвращает капитализированную первую букву имени раздела (см. sectionIndexTitleForSectionName: в NSFetchedResultsController).

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.

  • Укажите типы изменения.

    Объявление

    Swift

    enum NSFetchedResultsChangeType : UInt { case Insert case Delete case Move case Update }

    Objective C

    enum { NSFetchedResultsChangeInsert = 1, NSFetchedResultsChangeDelete = 2, NSFetchedResultsChangeMove = 3, NSFetchedResultsChangeUpdate = 4 }; typedef NSUInteger NSFetchedResultsChangeType;

    Константы

    • Insert

      NSFetchedResultsChangeInsert

      Указывает, что был вставлен объект.

      Доступный в iOS 3.0 и позже.

    • Delete

      NSFetchedResultsChangeDelete

      Указывает, что был удален объект.

      Доступный в iOS 3.0 и позже.

    • Move

      NSFetchedResultsChangeMove

      Указывает, что был перемещен объект.

      Доступный в iOS 3.0 и позже.

    • Update

      NSFetchedResultsChangeUpdate

      Указывает, что был изменен объект.

      Доступный в iOS 3.0 и позже.

    Оператор импорта

    Objective C

    @import CoreData;

    Swift

    import CoreData

    Доступность

    Доступный в iOS 4.0 и позже.