setFetchBatchSize似乎不能正常工作

我就这个问题提出几个问题,但仍然无法实现。 我有一个核心数据,我在桌面视图中显示了10k行的人名。 我希望能够search和更新每个字母的表。 这是非常缓慢的。 正如我所build议的,我看WWWDC '10核心数据的演示,并试图实施

[request setFetchBatchSize:50]; 

似乎没有工作。 当我使用仪器来检查核心数据时,仍然显示加载tableview时仍然有10k的请求,当我search它也得到所有的结果。 还有什么需要做的设置批量大小或那不会帮助我。

似乎工作的唯一的事情是设置fetchlimit为100当我search。 你认为它是一个很好的解决scheme吗?

提前致谢!

批量大小只是告诉它一次要提取多less个对象。 这可能不会帮你很多。 让我们考虑一下你的用例

用户键入“F”,然后告诉数据库“查找所有以'F'开头的名字”,数据库查看所有10k +logging以查找以'F'开头的名字

然后,用户键入'r',所以你告诉数据库去查找以“Fr”开头的所有logging,并再次查看所有10k +logging以find以“Fr”开头的logging。

fetchBatchSize正在做的是告诉它:“嘿,当你在一个logging中犯了错时,立即引入50,因为我可能需要所有这些。” 这没有任何限制你的search。

但是,将fetchLimit设置为100会有所帮助,因为数据库会通过所有10k +logging开始search,但一旦拥有了100条logging,就不必继续查看其余logging,因为它已经填充了它的请求。 完成后,只要获得满足请求的100条logging,就会停止search。

所以,你可以做几件事情,所有这些都取决于你的其他用例。

最简单的方法就是在search字段上添加一个索引。 您可以在Xcode模型编辑器中设置它(指示索引的部分,就在您可以在检查器中指定实体的位置)。 这将允许数据库在该字段上设置一个特殊的索引,search速度会更快。

其次,在你最初的请求之后,你已经有了一个以'F'开始的名字的数组,所以不需要返回到数据库来请求以'Fr'开头的名字。如果它以'Fr'开头,以'F'开始,并且你已经拥有NSManagedObject指针。 现在,你可以search你回来的数组。

更好的是,如果你给它一个sorting描述符,数组就被sorting。 因此,你可以在数组上进行简单的二分search。 或者,如果您愿意,也可以使用相同的谓词,并将其应用于结果数组而不是数据库。

即使你不使用我刚刚讨论过的结果修剪,我认为索引这个属性也会带来很大的影响。

编辑

也许你应该运行仪器,看看你花了多less时间在哪里。 另外,一个严重的谓词可以给任何索引scheme带来负面影响。 代码将有所帮助。

最后,考虑你将多less元素带入内存。 CoreData不会错误的所有信息,但它确实为数组中的所有内容创build了shell。

如果你给它一个sorting谓词,

我不知道SQLLite如何在一个索引上实现它的search,但是B-Tree的复杂度是logBN,所以即使在30k条logging上,这也不是很多的search。 除非你有另一个问题,索引应该给你一个很大的改进。

一旦你有索引,你不应该检查所有的logging。 但是,您仍然可能拥有非常大的一组数据。 对这些尝试fetchBatchSize,因为它会限制获取logging的数量,并为其余的创build代理。

您也可以调用countFetchRequext而不是executeFetchRequest来获取项目的数量。 然后,你可以使用fetchLimit来限制你得到的数字。

就所有这一切都与一个取得成果的控制者…这个人必须知道logging,所以它仍然必须做search。

另外,一个地方看…你在做部分? 如果你有一个用户定义的比较器(比如翻译部分),那么每个logging都会被调用。

因此,我想我的重大build议是,在指数发生变化之后,要运行工具并真正研究它以确定你在哪里花费时间。 这应该是非常明显的。 这将有助于引导你走向真正的问题。

我敢打赌,由于某种原因你仍然可以访问所有的元素。