【问题标题】:Why we can't change FetchRequest at NSFetchedResultsController?为什么我们不能在 NSFetchedResultsController 上更改 FetchRequest?
【发布时间】:2011-11-04 06:39:28
【问题描述】:

示例我在 ListController 中调用了 NSFetchedResultsController,称为 FetchController

+(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();
}

问题是我不喜欢在请求更改时总是执行Fetch,我想让它变得容易

[self ListController].FetchController.fetchRequest=[self FunctionTogetNewRequest];

但是 [self ListController].FetchController.fetchRequest 是只读的..

我想这样做是因为我不想一次又一次地执行 Fetch.. 我可以这样做吗?

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

【问题讨论】:

    标签: objective-c xcode core-data


    【解决方案1】:

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

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

    我认为使用 NSFetchedResultsController 的全部意义在于我们 不必那样做?

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果我缓存结果会怎样?如果不缓存结果,是否需要再次调用 performFetch?
      • 修改 fetch 请求会使你的缓存结果失效。任何时候修改获取请求,都应该重新获取结果集。
      • 虽然这可能有效,但请考虑 Apple 在其文档中所写的内容:IMPORTANT You must not modify fetchRequest after invoking this method [NSFetchedResultsController init method]. For example, you must not change its predicate or the sort orderings.
      • 他们已经更新了他们的文档,说如果缓存设置为 nil 就可以了。但是当然,如​​果你每次都删除它应该没问题:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2017-02-06
      • 1970-01-01
      • 2011-04-23
      相关资源
      最近更新 更多