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

use*_*951 14 xcode core-data objective-c

示例我在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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

问题是我不喜欢在请求发生变化时始终执行performFetch,我想让它变得简单

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Cam*_*ert 26

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

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

  • 虽然这可能有效,但请考虑Apple在其文档中写的内容:`重要事项在调用此方法后,您不能修改fetchRequest [NSFetchedResultsController init方法].例如,您不得更改其谓词或排序顺序 (3认同)
  • 此后,他们更新了文档,说将缓存设置为nil是可以的。但是,当然,如果您每次都删除它,就可以了:) (2认同)

Tec*_*Zen 10

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

是的,因为您更改了需要生成新控制器的提取的谓词.

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

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

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