我有这个工作代码,但现在我需要能够根据predicateWithFormat中使用的对象更改NSPredicate,如下所示:
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;
当我从具有此tableviewcontroller属性的app delegate更改_currentUser对象时,我需要fetchedResultsControlelr来使用新的_currentUser对象。
[self.tableViewcontroller setCurrentUser:user];
谢谢!
答案 0 :(得分:1)
您可以随时更改谓词,但请务必通过performFetch
重新获取。也来自Apple docs:
重要:重要提示如果您正在使用缓存,则必须在更改任何获取请求之前调用deleteCacheWithName: 谓词或其排序描述符。你不能重复使用它 除非您设置了,否则为多个查询提取结果控制器 cacheName为nil。
另外,来自NSFetchedResultsController
的Apple文档:
修改提取请求您不能简单地更改提取请求 修改结果。如果您想更改获取请求,那么您 必须:
如果您使用缓存,请将其删除(使用deleteCacheWithName :)。 通常,如果要更改提取,则不应使用缓存 请求。
更改提取请求。
- 调用performFetch:。
答案 1 :(得分:1)
每当currentUser
的值发生变化时,请执行此操作(可能在setter中):
NSError *error = nil;
self.fetchedResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"atrObj == %@", self.currentUser.atrObj];
if(![self.fetchedResultsController performFetch:&error]) {
// Handle errors
}