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

Core data NSFetchedResultsController是否一次获取所有结果?,core-data,ios7,Core Data,Ios7,我在核心数据中有大量的对象。以下内容是否仅在需要时加载UI所需的内容,还是预先加载所有对象 NSFetchedResultsController确实具有fetchedObjects属性。。这是否意味着它会提前获取所有信息?解决这个问题的正确方法是什么 NSManagedObjectContext *context = # get from somewhere NSManagedObjectModel *model = context.persistentStoreCoordina

我在核心数据中有大量的对象。以下内容是否仅在需要时加载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将根据需要(当您的UI滚动并向FRC提出新的数据请求时)加载新的结果“页面”(到内存中)


从技术上讲,并不是FRC在做这件事,而是fetch返回的数组对象,它最初包含“空”对象,并根据需要透明地对批对象进行错误处理。

不,FRC被赋予了主线程上下文(必须),所有内容都在主线程上。如果一个批处理大小设置需要花费太长时间,那么您需要配置和考虑有趣的替代品…如果使用IOS8,您可以使用新的NSRealthOffTeFixRebug,它将在后台执行获取。