Разница между получением объекта с помощью FetchResultController и managedObjectContext
Вопрос
В чем разница между получением элементов из Core Data с помощью FetchResultController или managedObjectContext??
1) FetchResultController (Контроллер выборки)
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext: managedObjectContext]];
NSSortDescriptor *sortDescriptorNameAscending = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorNameAscending,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptorNameAscending release];
NSFetchedResultsController *frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Lists"];
2) Управляемый объект Context
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext]];
NSError *error = nil;
NSArray *items = [ managedObjectContext executeFetchRequest:request error:&error];
Решение
Смысл использования NSFetchedResultsController
в отличие от просто NSFetchRequest
это мониторинг ваших данных и удобные методы при работе с разделами.
Когда имеешь дело только с NSFetchRequest
вы должны сами определить разделы, и вам нужно повторно извлекать свои данные, когда что-то меняется.
Когда имеешь дело с NSFetchedResultsController
, он определит ваши разделы, кэширует результаты (делая второй запрос для этих данных почти мгновенным) и предоставит удобные методы для вашего NSTableView.Наконец, когда ваши данные изменяются, NSFetchedResultsController
уведомит вас через своих делегатов.
Внутренние данные для обоих из них будут одинаковыми.Разница заключается в управлении состоянием этих данных.
Другие советы
В NSFetchedResultsController
объект сообщит вам, когда объекты вашего запроса изменятся.Просто предоставьте объект делегата для приема вызовов (см. Документ для NSFetchedResultsControllerDelegate
протокол).Он также предоставляет вам управление разделами, что полезно, если вы хотите отобразить данные в табличном виде.