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

时间:2013-07-17 16:42:47

标签: ios uitableview core-data nsfetchedresultscontroller

我在我的应用中使用核心数据来存储可能有多达50k或更多对象的实体。我在表视图中将它与NSFetchedResultsController配对。由于单元重用,表视图工作正常但是我最大的问题是将实际数据库排空以获取数据集。

当我第一次加载表视图时,我需要db的所有结果。我使用带有单个排序描述符的默认提取请求,并且我已将batchSize设置为1,000。在iPad 2上,此查询最多需要 15秒才能完成!我也必须在取消搜索后运行此查询,因此整体上它使应用程序无法使用。我的假设是CD仍然必须解决所有这些结果或设置部分或东西,我真的不知道但只是使用batchSize没有帮助?内容也是非常动态的,因为新行总是被添加,排序顺序改变等等。所以缓存的好处有限。

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

任何人都有任何想法或处理过这个问题吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

s.newave,

你的行有不同的高度吗?如果是这样,那么表视图会要求您计算每个高度,这会导致获取每一行。 15秒不是获取50K物品的不合理时间。

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

安德鲁

P.S。获取的结果控制器专为主流应用程序而设计。 50K表视图不是主流应用程序。如果您坚持使用50K表视图设计,则必须自己制作控制器。