NSFetchedResultsController 是否一次获取所有结果?

Does NSFetchedResultsController fetch all results at once?

我在 Core Data 中有大量对象。以下是仅在需要时加载 UI 所需的内容,还是预先加载所有对象?

NSFetchedResultsController 确实有一个 fetchedObjects 属性.. 这是否意味着它会预先获取所有内容?解决此问题的正确方法是什么?

    NSManagedObjectContext *context = # get from somewhere
    NSManagedObjectModel *model = context.persistentStoreCoordinator.managedObjectModel;
    NSDictionary *vars = @{...};
    NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@"..."
                                                substitutionVariables:vars];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"..." ascending:NO];
    NSArray *sortDescriptors = @[sortDescriptor];
    fetchRequest.sortDescriptors = sortDescriptors;


    NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]
                                              initWithFetchRequest:request
                                              managedObjectContext:context
                                              sectionNameKeyPath:nil
                                              cacheName:@".."];

您通常不应该使用 fetchedObjects。它将始终是已获取对象的完整列表,其中一些可能在内存中,一些可能是错误的。

重点是您希望 FRC 仅根据需要加载数据(到故障对象)。但是,要做到这一点,您需要根据 UI 一次可以显示的内容(可以同时显示在屏幕上的最大项目数)来告诉它加载多少。

为此,您需要在 NSFetchRequest 上设置 fetchBatchSize。完成后,FRC 将根据需要加载新的 'page' 结果(到内存中)(当滚动 UI 并向 FRC 发出新的数据请求时)。

从技术上讲,并不是 FRC 在执行此操作,而是 fetch 返回的数组对象,该对象最初包含 'empty' 个对象,并且根据需要透明地对批量对象进行故障处理。