Почему мы не можем изменить FetchRequest в NSFetchedResultsController?

Пример. У меня есть NSFetchedResultsController, вызываемый в ListController с именем FetchController

+(NSFetchRequest * )fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending;

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending];

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease];
    NSLog(@"FRC : %@",FRC);
    return FRC;
}

посмотрите на этот код, я вызываю searchControllerInContext, когда хочу сделать NSFetchedResultsController, а затем перенести его с помощью этого кода:

if (![[self ListController].FetchController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

Проблема в том, что мне не нравится всегда выполнятьFetch, когда запрос изменяется, я хочу упростить его с помощью

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest];

но [self ListController].FetchController.fetchRequest доступен только для чтения.

Я хочу сделать это, потому что я не хочу, чтобы perfomFetch снова и снова.. могу ли я это сделать?

Я имею в виду, если у меня есть программа, которая дает записи на основе того, что пользователь помещает в поле поиска, должен ли я создавать новый контроллер каждый раз при изменении содержимого окна поиска? Это было бы странно. Я думал, что весь смысл использования NSFetchedResultsController заключается в том, что нам не нужно это делать?

Ответы

Ответ 1

Даже если fetchRequest является свойством readonly, вы можете его изменить. Например, настройка предиката запроса выборки работает отлично, если вы не кэшируете результаты (или пока вы сначала удаляете кеш). Я успешно использовал эту технику в ряде проектов. После изменения запроса на выборку вы должны снова вызвать performFetch.

Нижняя строка: вам не нужно создавать FRC каждый раз при изменении условий поиска. Просто удалите кеш, измените предикат запроса выборки и выберите новый результирующий набор с существующим экземпляром.

Ответ 2

если у меня есть программа, которая дает записи на основе того, что пользователь вводил ящик поиска, должен ли я создавать новый контроллер каждый раз, когда окно поиска изменение содержимого?

Да, потому что вы меняете предикат на выборку, которая требует генерации нового контроллера.

Я думал, что весь смысл использования NSFetchedResultsController заключается в том, чтобы мы не нужно это делать?

Точка FRC должна автоматически обрабатывать взаимодействие между контекстом и табличным представлением. Он имеет специальные свойства для возврата разделов и строк, а также методы делегирования для изменения таблицы в ответ на изменения в модели данных. Поскольку FRC определяется его выборкой, когда вы вносите изменения в выборку, вам нужно создать новый FRC

Не делайте ошибку, думая о том, что FRC имеет большой дорогостоящий объект. Не это. Нет проблем с созданием и удалением большого количества FRC по мере необходимости.