Предикат NSPredicWithFormat с объектом, который изменяется со временем - PullRequest
0 голосов
/ 28 марта 2012

У меня есть этот рабочий код, но теперь мне нужно иметь возможность изменить NSPredicate, основываясь на объекте, используемом в предикатеWithFormat, следующим образом:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:@"Item" inManagedObjectContext:_context];

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"self.atrObj == %@", _currentUser.atrObj.objectID]];

[fetchRequest setEntity:entity];

NSSortDescriptor *sortContent = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortContent]];
[fetchRequest setFetchBatchSize:10];
NSFetchedResultsController *theFetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:_context sectionNameKeyPath:nil 
                                               cacheName:nil];

self.fetchedResultsController = theFetchedResultsController;
self.fetchedResultsController.delegate = self;

Мне нужен fetchedResultsControlelr для использования нового _currentUserобъект, когда я изменяю объект _currentUser из делегата приложения, у которого есть свойство tableviewcontroller.

[self.tableViewcontroller setCurrentUser:user]; 

Спасибо!

Ответы [ 2 ]

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

Всякий раз, когда значение currentUser изменяется, делайте это (возможно, внутри установщика):

NSError *error = nil;
self.fetchedResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"atrObj == %@", self.currentUser.atrObj];
if(![self.fetchedResultsController performFetch:&error]) {
    // Handle errors
}
1 голос
/ 28 марта 2012

Вы можете изменить предикат в любое время, но обязательно повторите выборку с помощью performFetch.Также из документов Apple:

Важно : Важно Если вы используете кэш, вы должны вызвать deleteCacheWithName: перед изменением любого запроса на выборку, его предиката или дескрипторов его сортировки,Вы не должны повторно использовать один и тот же контроллер результатов для нескольких запросов, если только для параметра cacheName не установлено значение nil.

Кроме того, из документов Apple NSFetchedResultsController:

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

  • Если вы используете кеш, удалите его (используя deleteCacheWithName :).Обычно вы не должны использовать кеш, если вы изменяете запрос на выборку.

  • Изменить запрос на выборку.

  • Invoke executeFetch:.
...