我有450,000条记录的coredata。
要在uitableview中显示它我正在使用NSFetchedResultsController。 它有效,但问题很严重。
在NSFetchedResultsController开始工作之前,我们需要调用 的 performFetch: 我的情况这个功能大约2-3分钟。之后,我可以 在UITable中显示数据没有任何问题。但那2-3分钟 杀了我:(
它不会那么糟糕,但我也需要在这张表中进行搜索。 因此,对于搜索,我需要更改谓词,调用 performFetch:和 再等2-3分钟!
有没有让 performFetch:更快? 或者至少有人可以告诉我如何在不打电话的情况下进行搜索 performFetch:?
答案 0 :(得分:3)
2-3分钟对于仅获得450,000条记录来说肯定太长了。您是否使用谓词解析字符串?确保您使用了这些优化策略:
fetchBatchSize
来优化您的抓取。 (尝试一些设置,看看什么最适合您的数据类型)。 至于搜索,这是一个对我有用的策略:
答案 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,看看是否需要太长时间。如果我不得不猜测,我会说你的查询正在进行全表扫描,而不是使用适当的索引。全表扫描成本很高。
如果这确实是瓶颈,它还可以帮助您优化搜索。
以下是一些有用的链接。