fetchedResultsController лучшие практики для получения сущностей с предикатом - PullRequest
0 голосов
/ 28 марта 2012

Итак, у меня есть следующий код для извлечения всех моих основных сущностей данных, который называется «Настройки»

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController_ != nil) {
        return fetchedResultsController_;
    }

    /*
     Set up the fetched results controller.
     */
    // Create the fetch request for the entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    // Edit the entity name as appropriate.
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Setting" inManagedObjectContext:self.managedObjectContext_];
    [fetchRequest setEntity:entity];

    [fetchRequest setReturnsObjectsAsFaults:NO];
    [fetchRequest setResultType:NSManagedObjectResultType];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"serviceName" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // Edit the section name key path and cache name if appropriate.
    // nil for section name key path means "no sections".
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext_ sectionNameKeyPath:nil cacheName:nil];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController_ = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];

    return fetchedResultsController_;
}

У меня есть свойство NSFetchedResultsController *fetchedResultsController, и я использую его через приложение через:

[self.fetchedResultsController_ fetchedObjects]

Вопрос в том, что я хочу получить объекты с определенным свойством, то есть с предикатом:

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K == %@", @"settingName", somesettingName];
      [fetchRequest setPredicate:predicate];

Вопрос в том, должен ли я создать новый fetchResultsControllerWithServiceName: (NSString *) serviceName или я должен просто использовать существующий метод? Какова лучшая практика для этого?

1 Ответ

1 голос
/ 28 марта 2012

Конечно, быстрее (хотя я не уверен, насколько быстрее) модифицировать существующий контроллер запросов на выборку, а не создавать его заново каждый раз, когда необходимо обновить ваш предикат.В документации Apple четко сказано, что «вы не должны использовать кеш, если вы изменяете запрос на выборку», но поскольку вы в настоящее время не используете кеширование, это не проблема.

Итак, все, что вам нужно сделать, чтобы получить обновленные результаты, это обновить предикат, вызвать performFetch: на контроллере полученных результатов и ответить на полученные вами ответные вызовы делегата.

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

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