使用 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 和通配符。 使用fetchLimitfetchBatchSize限制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 搜索时间的主要内容,如果未能解决你的问题,请参考以下文章

C++ - Tesseract 令人失望的性能

行业现状令人失望,工作之后我又回到UC伯克利读博了

在搜索栏处于活动状态时删除表格视图中的单元格 - CoreData 错误

iOS 想知道使用 CoreData ManagedObjects 或 NSMutableArrays 哪种搜索方法最有效?

Django4.0抢先看,结果令人失望

ios coredata 搜索大型数据集