2012-03-28 41 views
0

我有这样的工作代码,但现在我需要能够基于在predicateWithFormat使用的对象,就可以改变NSPredicate,如下所示:NSPredicate predicateWithFormat与对象随时间变化

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属性的应用程序委托中的_currentUser对象时,fetchedResultsControlelr将使用新的_currentUser对象。

[self.tableViewcontroller setCurrentUser:user]; 

谢谢!

回答

1

你可以改变谓词随时但一定通过performFetch重新提取。同样来自苹果文档:

重要:重要如果您使用的是高速缓存,则必须调用deleteCacheWithName:改变任何读取请求时,其谓语 ,或者它的排序描述符之前。除非将 cacheName设置为零,否则不得重复使用同一个 提取的结果控制器进行多个查询。

此外,从NSFetchedResultsController苹果文档:

修改获取请求你不能简单地改变读取请求 修改的结果。如果你想改变的读取请求时,你必须 :

  • 如果您使用的是高速缓存,(使用deleteCacheWithName :)删除它。 通常,如果您要更改提取 请求,则不应使用缓存。

  • 更改提取请求。

  • 调用performFetch :.
+0

谢谢!我不知道你可以随时改变谓词,知道的好东西! – 2012-03-29 02:45:27

1

每当currentUser的值发生变化,这样做(也许是二传手内):

NSError *error = nil; 
self.fetchedResultsController.fetchRequest.predicate = [NSPredicate predicateWithFormat:@"atrObj == %@", self.currentUser.atrObj]; 
if(![self.fetchedResultsController performFetch:&error]) { 
    // Handle errors 
} 
+0

谢谢!我不知道你可以随时改变谓词,知道的好东西! – 2012-03-29 02:44:34