批处理核心数据获取结果

时间:2012-06-22 23:19:28

标签: objective-c ios cocoa core-data

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

然而,我无法弄清楚的是,如果在我第二次获取我取得对象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];

2 个答案:

答案 0 :(得分:3)

您实际上并不需要做任何事情来批量获取您指定的尺寸。您将获得您描述的行为只是在单个控制器上执行单个获取请求 - 通过设置批量大小属性,您只需向CoreData暗示您认为最合适的批量大小自己考虑。 CoreData将处理在您需要的指定大小的连续批处理中获取对象 - 并且在需要内存消耗时它将使管理对象出错。

答案 1 :(得分:3)

使用ANY是一项相当昂贵的操作。我不确定关系,但您可以尝试为特定标记名称而不是在您的消息对象实体上获取标记实体。然后使用反向关系来获取消息对象实体

你的那种也正在使用一种比较器,我相信这对你没有帮助。日期应该由核心数据存储为整数,这样您就可以直接排序而不使用选择器。

核心数据非常快,我已经完成了65,000条记录的关键字搜索,并以毫秒为单位返回了结果。

好的luc