CoreData,NSFetchedResultsController和performFetch:

时间:2013-03-29 13:07:15

标签: iphone ios core-data

我有450,000条记录的coredata。

要在uitableview中显示它我正在使用NSFetchedResultsController。 它有效,但问题很严重。

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

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

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

2 个答案:

答案 0 :(得分:3)

2-3分钟对于仅获得450,000条记录来说肯定太长了。您是否使用谓词解析字符串?确保您使用了这些优化策略:

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

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

  • 仅在几次击键(例如两次)之后才进行搜索。
  • 有效击键后,启动计时器,比如说0.2秒。如果在计时器触发之前没有其他击键,则仅启动新的提取。
  • 在后台获取。提取完成后,在主线程上重新加载表视图。
  • 维护一系列预定的搜索提取。如果计划的提取被UI取消(例如,另一个按键),则不要启动它。
  • 不要使用不区分大小写和变量不敏感的搜索,因为这非常昂贵。相反,如果可行,只需从单词/名称的开头搜索。如有必要,使用Apple的WWDC12视频中建议的单独实体中的单词(简体,小写)构建索引。

答案 1 :(得分:0)

2-3分钟是很长时间才能完成450,000条记录。我怀疑大部分时间是花在一些sqlite调用而不是你自己的代码中。使用Time Profiler查看performFetch:树下花费最多时间的呼叫。

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

-com.apple.CoreData.SQLDebug 1

有关详细信息,请参阅此question

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

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

以下是一些有用的链接。

  1. How can I improve core data fetch performance on the iPhone?
  2. Optimizing Core Data searches and sorts