1

我有 450.000 条记录的核心数据。

为了在 uitableview 中显示它,我使用 NSFetchedResultsController。它有效,但有很大的问题。

在 NSFetchedResultsController 开始工作之前,我们需要调用 performFetch: 我的情况是这个函数工作大约 2-3 分钟。之后,我可以毫无问题地在 UITable 中显示数据。但是那 2-3 分钟杀了我:(

它不会那么糟糕,但我还需要在这个表中进行搜索。因此,对于搜索,我需要更改谓词,调用performFetch:并再次等待大约 2-3 分钟!

反正有没有让performFetch:更快?或者至少有人可以告诉我如何在不调用performFetch:的情况下进行搜索?

4

2 回答 2

3

2-3 分钟对于仅获取 450.000 条记录来说绝对是太长了。您是否使用谓词解析字符串?确保您使用了以下优化策略:

  • 通过调整来优化您的抓取fetchBatchSize。(尝试一些设置,看看哪种设置最适合您的数据类型)。
  • 避免对节标题进行复杂的查询。如果您正在通过关系的某些属性计算部分标题,请重新考虑您的方法。获取保存部分信息的实体并从那里填充每个部分中的行可能会更好。
  • 您是否为搜索和排序所依据的字段编制索引?
  • 尽可能使用模型中定义的获取请求模板。这将大大加快速度。

至于搜索,这是一个对我有用的策略:

  • 仅在几次击键(例如两次)后才对搜索做出反应。
  • 在有效击键后,启动一个计时器,例如 0.2 秒。只有在计时器触发之前没有再次击键时才开始新的获取。
  • 在后台获取。获取完成后在主线程上重新加载表视图。
  • 维护一组预定的搜索提取。如果计划的提取被 UI 取消(例如,另一个按键),请不要启动它。
  • 不要使用不区分大小写和不区分变音的搜索,因为这非常昂贵。相反,如果可行,只需从单词/名称的开头进行搜索。如有必要,按照 Apple 的 WWDC12 视频中的建议,仅使用要在单独实体中搜索的单词(简体、小写)构建索引。
于 2013-03-29T13:42:09.160 回答
0

2-3 分钟是很长的时间来浏览 450,000 条记录。我怀疑大部分时间都花在了一些 sqlite 调用而不是你自己的代码上。performFetch:使用 Time Profiler 并查看在树下花费最多时间的调用。

要查看您的 SQL 是否已优化,请通过将其添加到方案设置中的“启动时传递的参数”来启用 SQLite 日志记录:

-com.apple.CoreData.SQLDebug 1

有关此问题的更多详细信息,请参阅此问题。

运行您的应用程序并记下调用 performFetch: 时执行的查询。接下来,阅读关于EXPLAIN QUERY PLAN. 如果 sqlite 是瓶颈,这是您可以使用的最有用的工具。您需要从您的应用程序(模拟器或设备)中获取 .sqlite 文件,并在您的查询上运行 EXPLAIN QUERY PLAN 并查看是否花费了太长时间。如果我不得不猜测,我会说您的查询正在执行全表扫描,而不是使用适当的索引。全表扫描代价高昂。

如果这确实是瓶颈,它还可以帮助您优化搜索。

这里有一些有用的链接。

  1. 如何提高 iPhone 上的核心数据获取性能?
  2. 优化核心数据搜索和排序
于 2013-04-07T10:07:04.943 回答