Почему мы не можем изменить FetchRequest в NSFetchedResultsController? - PullRequest
14 голосов
/ 26 августа 2011

Пример У меня есть 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();
}

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

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

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

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

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

Ответы [ 2 ]

25 голосов
/ 27 августа 2011

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

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

10 голосов
/ 26 августа 2011

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

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

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

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

.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...