如何有效处理核心数据中的大数据集?

问题描述:

我在我的应用程序中使用核心数据来存储可能具有多达50k个对象或更多对象的实体。我有一个NSFetchedResultsController在表视图中配对。表格视图工作正常,由于细胞重用,但我最大的问题是排队实际的数据库来获取数据集。如何有效处理核心数据中的大数据集?

当我第一次加载表视图我需要从数据库的所有结果。我使用默认的获取请求与一个排序描述符,我已经将batchSize设置为1,000。在iPad 2上,此查询最多需要15秒才能完成!我也必须在搜索被取消之后运行这个查询,所以总体上它使应用程序不可用。我的假设是,CD仍然必须解决所有这些结果或设置节或什么,我真的不知道,但只使用batchSize不会帮助?内容也是非常动态的,因为新行总是被添加,排序顺序改变等等。所以缓存具有有限的益处。

我现在在想,最好的选择是在fetchRequest中使用fetchLimit,然后实现一些基本的分页。当表格视图滚动到结尾时,获取结果的下一个“页面”?这种方法唯一的问题是我失去了sectionIndex,我不能想出任何方法。

任何人有任何想法或已经处理此问题?

+0

为什么你需要整个数据集? – Wain

当您为FRC设置提取请求时,批量大小应该比任何时候在屏幕上可以看到的项目数量大一倍,可能是其大小的两倍。 FRC已经为您做了分页,您只需要更好地设置页面大小。

+0

thx我明白批量大小如何工作,但我的问题是实际的SQL查询需要永远。 –

+0

但为什么你需要提出这么大的要求? – Wain

+0

好问题。不幸的是,这是产品设计的方式。我猜它与其他任何具有大量行的应用程序没有什么不同,但通过每页仅显示x个结果来解决此问题。模拟这一点的唯一方法是使用fetchLimit来阻止核心数据获取更多数据,然后才需要。数据也不适用于我可以用来缩小结果集的一致分组。 –

s.newave,

您的行的高度是否可变?如果是这样,那么表视图会要求您计算每个高度,并导致每行都被提取。 15秒是不合理的时间来获取50K项目。

更大的问题是您不想更改设计的陈述。坦率地说,一个50K项目的tableview是没用的。你应该改变你的设计 - 不是因为CD很慢,它不是 - 但是因为你的设计不实用。

Andrew

P.S.获取的结果控制器是为主流应用程序设计的。 50K桌面视图不是主流应用程序。如果你坚持使用50K的桌子视图设计,你将不得不自己制造控制器。