为什么我们不能在NSFetchedResultsController上更改FetchRequest?

时间:2011-08-26 06:34:30

标签: objective-c xcode core-data

示例我在ListController中调用了名为FetchController

的NSFetchedResultsController
+(NSFetchRequest * )fetchRequestInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending;

+(NSFetchedResultsController *) searchControllerInContext: (NSString*) entityName : (NSPredicate *) predicate : (NSString*) sortKey : (BOOL) sortAscending 
{
    NSFetchRequest *request = [self fetchRequestInContext:entityName :predicate :sortKey :sortAscending];

    NSFetchedResultsController * FRC=[[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[ThreadClass managedObjectContext] sectionNameKeyPath:Nil cacheName:Nil]autorelease];
    NSLog(@"FRC : %@",FRC);
    return FRC;
}

看看那段代码,当我想创建NSFetchedResultsController然后使用这段代码执行它时,我调用searchControllerInContext:

if (![[self ListController].FetchController performFetch:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}

问题是我不喜欢在请求变更时总是执行提取,我希望通过

轻松实现
[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest];

但[self ListController] .FetchController.fetchRequest是readonly ..

我想这样做,因为我不想一次又一次地使用perfomFetch ...我可以这样做吗?

我的意思是,如果我有一个程序根据用户放入搜索框提供记录,我应该在每次搜索框内容更改时创建一个新的控制器吗?那会很奇怪。我认为使用NSFetchedResultsController的重点是如此,我们不必这样做?

2 个答案:

答案 0 :(得分:25)

即使fetchRequest是只读属性,您也可以对其进行修改。例如,只要您没有缓存结果(或者只要先删除缓存),设置获取请求的谓词就能很好地工作。我已经在许多项目中成功使用了这种技术。修改获取请求后,您应该再次调用performFetch

结论:每次搜索字词更改时,您都不需要创建FRC。只需删除缓存,更改获取请求的谓词并使用现有实例获取新结果集。

答案 1 :(得分:10)

  

如果我有一个程序根据用户输入的内容提供记录   搜索框,我应该每次搜索框创建一个新的控制器   内容改变?

是的,因为您更改了需要生成新控制器的fetch的谓词。

  

我认为使用NSFetchedResultsController的重点是我们   不必这样做?

FRC的目的是自动处理上下文和tableview之间的交互。它具有返回节和行的专用属性以及委托方法来修改表以响应数据模型中的更改。由于FRC是由其提取定义的,因此当您对提取进行更改时,需要生成新的FRC

不要误以为FRC有一个庞大而昂贵的对象。不是。根据需要创建和处理大量FRC没有问题。