8

我正在执行一个返回大约 2000 个实体的获取请求。目前,这在我的设备上大约需要 20 秒。所以我想我可能会设置一个 100 的获取限制,然后当用户滚动到表格视图的末尾时,获取接下来的 100 个实体。这可以使用NSFetchRequest's setFetchLimit和来完成setFetchOffset

但是,我想不通的是,如果在我第二次提取对象 101-200 时,对象 1-100 会发生什么?我是否必须为每 100 个项目使用单独NSFetchedResultsController的,然后将我的表视图数据源方法配置为基于多个获取结果控制器进行查询?或者我可以NSFetchedResultsController以某种方式一次获取 100 个实体,但是在每次后续获取时,只需将接下来的 100 个项目添加到原始的 100 个项目中?

编辑:这是我的代码:

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription 
                                   entityForName:@"MessageObject" inManagedObjectContext:appDelegate.managedObjectContext];

    [fetchRequest setEntity:entity];
    NSPredicate *predicate= [NSPredicate predicateWithFormat:@"ANY tags.tagName==%@", currentTagObject.tagName];
    [fetchRequest setPredicate:predicate];
    NSSortDescriptor *sort= [[NSSortDescriptor alloc] initWithKey:@"createDate" ascending:NO selector:@selector(compare:)];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];
    [fetchRequest setFetchBatchSize:5];
4

2 回答 2

4

您实际上不需要做任何事情来实现您指定大小的批量获取。您将获得您所描述的行为,只需在单个控制器上执行单个获取请求 - 通过设置批量大小属性,您只是向 CoreData 提示您认为是您自己考虑的最佳批量大小。CoreData 将处理按您需要指定大小的顺序批次获取对象 - 并且在需要内存消耗时,它将对托管对象进行故障处理。

于 2012-06-22T23:23:00.317 回答
3

使用 ANY 是一项非常昂贵的操作。我不确定这些关系,但您可以尝试获取特定标签名称的标签实体,而不是您的消息对象实体。然后使用逆关系获取消息对象实体

此外,您的排序正在使用比较器,我确信这无济于事。日期应该由核心数据存储为整数,因此您可以在不使用选择器的情况下进行直接排序。

Core Data 非常快,我已经对 65,000 条记录进行了关键字搜索,并在几毫秒内返回了结果。

好运

于 2012-06-24T00:44:09.113 回答