iOS 最佳性能持久数据解决方案?

iOS optimal performance persistent data solution?

我正在构建一个基于 healthKit 的应用程序,我想知道如何最好地持久保存 healthKit 数据。

我目前的方法是获取数据并将其保存为自定义 class 对象的属性,然后将其作为 NSData 保存在核心数据中。

就性能而言,Realm 比 CoreData 快吗?

根据 http://qiita.com/moriyaman/items/1a2916f4c2b79e934370 CoreData 显然比 FMDB 慢,FMDB 又比 Realm 慢。即使考虑了故障和索引,有人可以确认这是否属实吗?

免责声明:我在 Realm 工作

在您提到的解决方案中,哪种持久性产品的性能最好的问题在很大程度上取决于您的数据 type/amount/frequency。由于 Core Data 和 FMDB 是 SQLite 之上的层,它们在设计上不可能比 SQLite 更快,但它们提供了足够的便利,值得许多用户使用。另一方面,Realm 不是基于 SQLite,而是它自己的专为现代智能手机设计的自定义数据库引擎。它旨在在强大的功能和简单的 API 之间取得更好的平衡,而不会增加很大的性能损失。

您可以在 Realm 的发布博客 post 中看到 public 比较 Realm/SQLite/Core Data/FMDB 的基准:http://realm.io/news/introducing-realm#fast

最后,您使用 NSCoding 之类的方法将 HealthKit 信息序列化为 NSData 的方法将非常低​​效。无论您选择哪种持久性解决方案,使用这些产品内置的序列化而不是存储已经序列化的数据 blob 会更好地为您服务。

正如我对@jpsim 的评论,很难简单地将 Core Data 的性能与 FMDB 等较低级别的框架或 Realm 等不同抽象的框架进行比较。您选择哪种方法将极大地影响您构建程序的方式,这往往会将性能问题转移到不同的地方。

Core Data 和 SQLite 解决的问题截然不同。 SQLite 是一个关系数据库。 Core Data 是一个对象持久化引擎。我不是 Realm 方面的专家,但它似乎试图在这两种方法之间取得平衡,比 Core Data 提供的控制更底层,但与对象模型的联系比 SQLite 更紧密。 Realm(至少在我的印象中)为您提供更多低级控制这一事实为您提供了优化事物或搞砸 IMO 的机会。这既不好也不坏,只是让同类比较变得困难,尤其是让通用 "performance benchmarks" 有问题。问题不在于 某人 是否有可能使用引擎 A 与引擎 B 编写更快的代码。问题在于 是否可能编写每个引擎中的代码都具有可接受的性能,同时避免错误并最大限度地缩短开发时间。

总的来说,我认为 HealthKit 数据应该存储在 HealthKit 中以保护隐私。无论如何,您应该小心地将这些数据存储在您自己的存储中。特别注意 the guidelines about iCloud:

Apps using the HealthKit framework that store users’ health information in iCloud will be rejected

我不知道这将如何影响您存储然后备份到 iCloud 的文档。把数据留在HealthKit中是最好的办法,不用担心这些问题。

无论如何,性能只是要考虑的轴心之一。您没有表明任何迹象表明您有非常特殊的性能问题(例如,您正在处理数万条记录,或实时数据,或类似的东西)。所以我会首先关注什么工具最能满足你的一般需求,然后做一些基本的实验来确保性能是合理的,然后在你发现问题时进行优化。