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:
были отправлены за данным событием изменения (таким как контроллер, получающий aNSManagedObjectContextDidSaveNotification
уведомление).Оператор импорта
Objective C
@import CoreData;
Swift
import CoreData
Доступность
Доступный в iOS 4.0 и позже.
-
контроллер (_: didChangeObject:atIndexPath:forChangeType:newIndexPath:) - controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
Уведомляет получатель, что выбранный объект был изменен вследствие добавления, удалите, переместитесь, или обновление.
Объявление
Swift
optional func controller(_
controller
: NSFetchedResultsController, didChangeObjectanObject
: AnyObject, atIndexPathindexPath
: NSIndexPath?, forChangeTypetype
: NSFetchedResultsChangeType, newIndexPathnewIndexPath
: 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 и позже.
-
контроллер (_: didChangeSection:atIndex:forChangeType:) - controller:didChangeSection:atIndex:forChangeType:
Уведомляет получатель относительно дополнения или удаления раздела.
Объявление
Swift
optional func controller(_
controller
: NSFetchedResultsController, didChangeSectionsectionInfo
: NSFetchedResultsSectionInfo, atIndexsectionIndex
: Int, forChangeTypetype
: 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:
были отправлены за данным событием изменения (таким как контроллер, получающий aNSManagedObjectContextDidSaveNotification
уведомление).Оператор импорта
Objective C
@import CoreData;
Swift
import CoreData
Доступность
Доступный в iOS 4.0 и позже.
-
Возвращает имя для данного раздела.
Объявление
Swift
optional func controller(_
controller
: NSFetchedResultsController, sectionIndexTitleForSectionNamesectionName
: 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 и позже.
-