objective-c - setFetchBatchSize 似乎无法正常工作

标签 objective-c ios core-data nsfetchrequest

我就这个主题问了几个问题,但仍然无法让它发挥作用。我有一个包含 10k+ 行人名的核心数据,我在 tableview 中显示。我希望能够用每个字母搜索和更新表格。它非常滞后。正如我所建议的,我观看了 WWWDC '10 核心数据演示并试图实现

[request setFetchBatchSize:50];

似乎不起作用。当我使用仪器检查核心数据时,它仍然显示加载 tableview 时仍有 10k 请求,并且当我搜索时它也获得所有结果。
是否还需要做任何其他事情来设置批量大小,或者这对我没有帮助。

唯一似乎有效的是在我搜索时将 fetchlimit 设置为 100。你认为这是一个很好的解决方案吗?

提前致谢!

最佳答案

批量大小只是告诉它一次要获取多少个对象。这可能不会对你有很大帮助。让我们稍微考虑一下您的用例......

用户输入“F”,你告诉数据库,“去查找所有以‘F’开头的名字”,然后数据库查看所有 10k+ 条记录以找到以‘F’开头的记录

然后,用户键入“r”,因此您告诉数据库查找所有以“Fr”开头的记录,并再次查看所有 10k+ 条记录以查找以“Fr”开头的记录。

fetchBatchSize 所做的只是告诉它“嘿,当你在记录中出错时,立即引入 50,因为无论如何我可能需要所有这些。”这不会限制您的搜索。

但是,将 fetchLimit 设置为 100 会有所帮助,因为数据库开始搜索所有 10k+ 条记录,但是一旦它有 100 条记录,它就不必继续查看其余的记录,因为它已经填满了它的请求。它完成了,并在获得 100 条满足请求的记录后立即停止搜索。

因此,您可以做几件事,这一切都取决于您的其他用例。

最简单的尝试是在您要搜索的字段上添加索引。您可以在 Xcode 模型编辑器中设置它(索引部分,就在您可以在检查器中命名实体的位置)。这将允许数据库在该字段上设置特殊索引,搜索速度会快得多。

其次,在您最初的请求之后,您已经有一个以“F”开头的名称数组,因此无需返回数据库询问以“Fr”开头的名称如果它也以“Fr”开头以 'F' 开头,并且您已经拥有所有这些的 NSManagedObject 指针。现在,您可以搜索返回的数组。

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

即使你不使用我刚刚讨论的结果修剪,我认为索引属性会显着增加。

编辑

也许您应该运行仪器以查看您在何处花费了多少时间。此外,一个错误形成的谓词可能会导致任何索引方案屈服。代码会有所帮助。

最后,考虑将多少元素带入内存。 CoreData 不会对所有信息进行错误处理,但它会为数组中的所有内容创建 shell。

如果你给它一个排序谓词,

我不知道 SQLLite 如何在索引上实现其搜索,但是 B 树具有复杂的 logBN,因此即使在 30k 记录上,搜索也不是很多。除非你有另一个问题,索引应该给你一个相当大的改进。

一旦有了索引,就不应该检查所有记录。但是,您仍然可能拥有非常大的数据集。尝试对那些使用 fetchBatchSize,因为它会限制获取的记录数量,并为其余的创建代理。

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

至于使用获取的结果 Controller 处理所有这些......好吧,那个人必须知道记录,所以它仍然必须进行搜索。

另外,一个地方看...你在做部分吗?如果你有一个用户定义的比较器(比如翻译部分),这将被每个记录调用。

因此,我想我的重要建议是,在更改索引后,运行工具并真正研究它以确定您将时间花在哪里。这应该是很明显的。这将有助于引导您解决真正的问题。

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

关于objective-c - setFetchBatchSize 似乎无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10319188/

相关文章:

core-data - 如何知道 NSPredicate 中抽象实体的类类型?

ios - UIView 中的 UIBezierPath 动画

objective-c - 如何像 Xcode 一样显示欢迎窗口?

iPhone CoreData 应用程序首次启动时崩溃

ios - Xcode - 如何修复 'NSUnknownKeyException',原因 : … this class is not key value coding-compliant for the key X"error?

ios - uitableviewCell 分隔线

iphone - 无法创建模型错误为 nil 的 NSPersistentStoreCoordinator

ios - 存储数百张图像

iphone - 是否有适用于 iPhone 的原生 YAML 库?

ios - *修改* UIbutton位置(Iphone SDK)