使用 CoreData 令人失望的 iOS 搜索时间
Posted
技术标签:
【中文标题】使用 CoreData 令人失望的 iOS 搜索时间【英文标题】:Disappointing iOS search times with CoreData 【发布时间】:2012-09-18 16:32:06 【问题描述】:我有一个运行在 ios 5.1.1 的 ipad 上的 coredata db。我的数据库中有大约 50,000 家公司。我在公司名称属性上创建了一个索引。我正在搜索此属性,有时会通过 fetchRequest 返回数千条记录。
当返回数千条记录时,可能需要几秒钟才能从提取中返回。这使得预先输入的搜索非常笨拙。
我预计未来会有更大的数据库。我有哪些选项可以实现真正快速的搜索功能?
谢谢。
【问题讨论】:
是的,对于 50K+ 个对象,实时搜索并不是最好的办法。 你真的需要搜索这么多项目作为预输入吗? 【参考方案1】:我建议观看最近几场 WWDC 的核心数据性能视频。他们经常谈论改善这种瓶颈的策略。视频中的一些建议:
将名称字段反规范化为单独的“不区分大小写和变音符号”searchString
字段,然后使用 <
、<=
或 BEGINSWITH
在该字段上进行搜索。避免使用 MATCHES
和通配符。
使用fetchLimit
和fetchBatchSize
限制NSFetchRequest
返回的结果数
如果您的公司对象很大,您可以将一些关键数据项提取到一个单独的较小的“标题”对象中,该对象仅用于搜索界面。然后在用户进行选择时将关系添加回主对象。
一些指向几个视频的指针(还有其他年份的更多视频):
WWDC 2012:第 214 场会议 - 核心数据最佳实践:45:00
WWDC 2010:第 137 场会议 - 优化 iPhone OS 上的核心数据性能:34:00
【讨论】:
【参考方案2】:虽然在许多情况下 Core Data 是正确的工具,但无论如何它都不是灵丹妙药。
查看这篇文章,其中讨论了一些优化策略以及 SQL 数据库是您更好选择而不是 Core Data 的案例:
http://inessential.com/2010/02/26/on_switching_away_from_core_data
老实说,在这种情况下,您最好使用 SQL 数据库而不是 Core Data,因为当您尝试访问 Core Data 实体上的属性值时,通常会导致错误并将对象拉入活动内存...肯定会有性能和速度成本。使用真正的数据库 - Core Data 不是真正的数据库,请参阅 http://cocoawithlove.com/2010/02/differences-between-core-data-and.html - 您可以查询数据库而无需从中创建对象。
【讨论】:
以上是关于使用 CoreData 令人失望的 iOS 搜索时间的主要内容,如果未能解决你的问题,请参考以下文章
在搜索栏处于活动状态时删除表格视图中的单元格 - CoreData 错误
iOS 想知道使用 CoreData ManagedObjects 或 NSMutableArrays 哪种搜索方法最有效?