存储大型数组时NSUserDefaults还是其他什么?

时间:2016-01-28 08:59:13

标签: ios objective-c core-data nsuserdefaults magicalrecord

我有一个将JSON读入内存中对象的应用程序。我有一个对象代表用户,然后是一个自定义对象数组。这个数组通常是20-50个对象,但在极少数情况下可以达到7-800个。

我已经阅读了一些有关此问题的线索,但发现很难选择,因为我想做的就是在本地缓存,仅此而已,这样我就可以从服务器中获取更少的内容。

我可以看到三种解决方案:

  1. NSUserDefaults的即可。不确定应用程序性能如何受到大型数组的影响

  2. CoreData / MagicalRecord 。看起来不错但有点复杂

  3. 使用NSCoding /解码的Plist

  4. 自定义解决方案

  5. 我倾向于NSUserDefaults或Plist,因为它看起来最简单,我只想在应用程序启动/存在时读取内存和内存。但是,在存储这么多对象时,我应该知道有什么问题,例如性能或应用启动时间吗?使用MagicalRecord还有其他原因吗?

    指针非常感谢。

    编辑:添加了plist / NSCoding选项,已经忘记了。

3 个答案:

答案 0 :(得分:4)

美好的一天,我的朋友,你有一个很好的问题让我们明白最好使用:

  • NSUserDefaults - 通常用于定义某些设置,帐户,是否定义应用程序,通常是一个易于存储和访问数据的全局变量

  • Plist - 少量不需要复杂查询的数据,编辑不是很多字段也适合存储,问题是plist中序列化的数组和字典是递归传递的,即,每个地块或其他容器中的字典只有一个外壳的一个级别。从这里开始,内容也受到限制:仅限于序列化的类型。

  • Coredata / SQLite - 需要结构化查询的大量数据,我想,首先你必须问“为什么我不应该在这里使用Coredata”。稍微了解一下,您就会明白Coredata非常适合存储任何类型和数量的数据。

  • MagicalRecord - 用于简化核心数据工作的库,其优点(清理我的核心数据相关代码,允许清晰,简单,单行提取,仍允许在请求优化时修改NSFetchRequest)如果您不理解Coredata的作用

  • ,我不建议使用

结果:如果实际上您需要存储一些键值,并且您不想理解核心数据并且没有时间学习,请使用plist获取数据。如果你想存储更难和更多的东西 - 只有coredata。我个人建议使用coredata,你确信它简单方便,只需要花时间。

use plist info

use core data info

祝你好运,做出正确的选择,我不明白为什么有人会对你的问题投票,这个问题真的很好而且就是具体的答案,来自我的+1 ......

答案 1 :(得分:1)

你可以写一个小的.sqlite数据库,这是永久性的,但仍然很容易。

核心数据功能非常强大,设置起来并不困难,以后它会派上用场。如果你知道以后可能需要它,不妨现在就去做。这是我认为最好的解决方案。 CoreData不仅仅是数据持久性,也不会浪费时间。

您也可以将其保存在.plist文件中(或任何类型的文件)。我认为这是目前最快,最简单的解决方案。不过我认为不是最干净的。

我强烈建议你不要使用NSUserDefaults,但他们并不是故意的。

答案 2 :(得分:1)

绝对同意@Zil - 去核心数据。有可能,你将在某个阶段使用它,所以它不会浪费学习曲线。

假设您可以使用唯一键识别800个自定义对象中的每一个,那么您只需要一个包含键和值的表,您就可以检索数据。根据这需要多长时间,您可能希望在后台队列中执行此操作,并在完成后更新UI。

这是让我开始的教程http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started