首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CoreData,NSFetchedResultsController和performFetch:

CoreData,NSFetchedResultsController和performFetch:
EN

Stack Overflow用户
提问于 2013-03-29 13:07:15
回答 2查看 536关注 0票数 1

我有450.000张记录的coredata。

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

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

不会那么糟糕,但我也需要在这张桌子上搜索。因此,对于搜索,我需要更改谓词,调用performFetch:,然后再等待2-3分钟!

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-07 10:07:04

2到3分钟是一个很长的时间去看45万记录。我怀疑大部分时间都是在sqlite调用中花费的,而不是您自己的代码。使用Time,查看performFetch:树下花费最多时间的调用。

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

代码语言:javascript
运行
复制
-com.apple.CoreData.SQLDebug 1

有关此问题的更多细节,请参见此问题

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

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

这里有一些有用的链接。

  1. 如何提高iPhone上的核心数据获取性能?
  2. 优化核心数据搜索和排序
票数 0
EN

Stack Overflow用户

发布于 2013-03-29 13:42:09

2到3分钟绝对是太长了,一次只有450.000次记录。您是用谓词解析字符串吗?确保您使用了以下优化策略:

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

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

  • 只有在几个关键的笔触(例如,两下)之后,才能对搜索做出反应。
  • 在一个有效的击键之后,启动一个计时器,比如说0.2秒。只有在计时器触发之前还没有发生另一个击键的情况下,才启动新的提取。
  • 把背景拿来。在完成提取后,重新加载主线程上的表视图。
  • 维护一个计划好的搜索获取数组。如果一个预定的提取被UI取消(例如,另一个击键),就不要启动它。
  • 不要使用不区分大小写和不敏感对话的搜索,因为这是非常昂贵的。相反,如果这是可行的,只需从单词/名称的开头搜索即可。如果有必要,按照苹果WWDC12视频中的建议,在一个单独的实体中建立一个索引,只需搜索单词(简化,小写)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15703879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档