我有450.000条记录的coredata。
为了在uitableview中显示它,我正在使用NSFetchedResultsController。
它可以工作,但是有很大的问题。
在NSFetchedResultsController开始工作之前,我们需要调用
PerformFetch:
我的情况下,此功能大约需要2-3分钟。之后我可以
在UITable中显示数据没有任何问题。但是那2-3分钟
杀了我:(
情况不会那么糟,但是我还需要在此表中进行搜索。
因此,对于搜索,我需要更改谓词,调用 performFetch:和
再等2-3分钟!
无论如何,可以使 performFetch:更快吗?
或者,也许至少有人可以告诉我如何在不调用 performFetch的情况下进行搜索:?
最佳答案
2-3分钟是要花费450,000条记录的漫长时间。我怀疑大部分时间都花在一些sqlite调用上,而不是您自己的代码上。使用时间分析器,并在performFetch:
树下查看花费最多时间的 call 。
若要查看您的SQL是否已优化,请通过将其添加到“方案”设置中的“启动时传递的参数”来启用SQLite日志记录:
-com.apple.CoreData.SQLDebug 1
有关更多详细信息,请参见question。
运行您的应用程序,并记下调用performFetch:时执行的查询。接下来,阅读有关
EXPLAIN QUERY PLAN
的信息。如果sqlite是瓶颈,这是您可以使用的最有用的工具。您需要从应用程序(模拟器或设备)中获取.sqlite文件,然后对查询运行EXPLAIN QUERY PLAN,以查看是否花费太长时间。如果我不得不猜测,我会说您的查询正在执行全表扫描,而不是使用适当的索引。全表扫描成本很高。如果确实是瓶颈,它也可以帮助您优化搜索。
这里是一些有用的链接。