NSFetchedResultsController一次性获取所有结果吗?

时间:2015-03-08 15:22:06

标签: core-data ios7

我在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:@".."];

1 个答案:

答案 0 :(得分:1)

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

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

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

从技术上讲,不是FRC正在这样做,它是fetch返回的数组对象,最初包含“空”对象,并且根据需要透明地对批量对象进行故障处理。