NSPredicate predicateWithFormat,其对象随时间变化

时间:2012-03-28 02:17:42

标签: ios core-data nspredicate

我有这个工作代码,但现在我需要能够根据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]; 

谢谢!

2 个答案:

答案 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
}