2013-04-14 55 views
5

问题:核心数据VS的NSFileManager

我一直在使用了一段时间,现在我自己的缓存系统使用NSFileManager。通常我收到的数据是JSON,我只是将字典直接保存到缓存中(在文档文件夹中)。当我需要它时,我会去得到它。我也实现了,有时当我觉得它更好时,根文件夹上的NSDictionary带有指定资源路径的键/值。例如:

关于日内瓦天气的资源17/02/2013,所以我将有一个名为GE_17_02_2013的密钥和值为带有信息的NSDictionary的路径。

通常我不需要做任何复杂的查询。但是,不管怎样,从我一直在阅读的内容来看,当你有很多数据时,你应该坚持核心数据。就我而言,我通常拥有大量的数据,但是我从来没有真正感受到应用程序的性能下降。所以我的问题是:

  1. 在这种情况下,如果有时(天气事情只是一个 例子)我只是需要删除所有数据(Twitter的饲料,为 为例),并通过更换全新的数据流,是Core 数据价值?我认为删除所有数据并插入(填充)它比存储NSDictionary更重,并取代旧数据。

  2. 有时它会进化得只剩图像,TEXTFILES等和 NSFileManager做它完美,所以有什么优点可以睿 数据在此情况下,带来了什么?

P.S:我刚才看到this后,在这种问题是由和数字证明了这一个实际上要快。不过,我还想要一个经验的答案。

回答

2

核心数据值得在您描述的每种情况下使用。事实上,如果一个应用程序存储多于首选项,那么你应该使用核心数据。这里有一些原因,其中,你会发现答案你自己的问题:

  • 肯定比文件系统更快,即使你消灭一切,你描述再写一遍(让你不从缓存中获益很多)。这基本上是因为您可以合并您的操作并只在需要时才访问商店。所以,如果你阅读,写作和阅读,你只能保存一次,其余的都在内存中完成,不用说,速度非常快。
  • 一切都是版本化的,你可以轻松地从一个版本迁移到另一个版本(同时保持用户在设备上的内容)
  • 80%的模型操作免费。就像,当某些事情发生变化时,您可以覆盖管理对象方法并通知您的控制器。
  • 使用cascade可以轻松地将删除甚至是非常复杂的对象结构
  • ,同时是一个坏主意,让图像在数据库中,你还可以让他们在文件系统和拥有核心数据自动删除当管理对象代表它们被删除
  • 非常灵活,实际上非常灵活,您可以通过编写自定义数据存储将您的项目从使用本地文件系统迁移到使用服务器进行非常少的修改。
  • 核心数据设计师基本上为您创建模型对象。你并不需要创建自己的模型类(你将不得不如果使用的文件系统)
+0

缓存更适用于离线场景。所以在正常的网络访问条件下,我通常会非常频繁地更换存储的数据,这就是我担心的原因。另一个好处是只使用'NSDictionary'而不需要知道他内部的内容(他是如何组成的)。只有'NSDictionary'的'NSManagedObject'有意义吗? – Peres

+0

缓存对于本地文件系统也很重要。文件系统访问比内存访问慢。我不确定为什么你不需要知道该字典里面的内容,不要将它解读为某种观点。如果您只存储像任何其他,这恰好是一个序列化的词典中的文件,那么是的,有一个在使用核心数据 –

+0

我的意思是没有意义的,我知道里面有什么,但如果由于某种原因,一个API的变化,并添加不同的东西,我不受此限制。 – Peres

1

在这种情况下...是核心数据值得吗?

是的,你需要更多的集中管理而不是试图绘制自己的文件系统模式。核心数据及其较低级别的表弟SQL仍然是我们现在拥有的持久性的最佳选择。此外,使用NSKeyed(Un)Archiver继续对字典进行反复序列化/反序列化的性能受到更大数据集的关注。

我想删除所有数据,并插入(填充)它是重 不仅仅是存储的NSDictionary和新人换旧人。

当然,是的。但是,您不必考虑像这样的缓存更新。如果您将Core Data想象为静态模型,则可以使用缓存层将数据输入和输出存储。需要有关天气的资源吗?检查缓存层。如果它不在那里,请使缓存运行一个获取请求。需要翻转整个缓存?让缓存空本身,然后运行一个请求来标记具有某种标志的每个实体以显示它们是无效的。当您看到所有新数据已安全地缓存在缓存中时,可以通过后台进程完成您担心的昂贵删除操作。

有时它会进化得只剩图像,TEXTFILES等和 的NSFileManager做它完美,所以有什么优势能核心数据 在这种情况下,带来了什么?

不幸的是,并不是很多。对于数据斑点(这基本上是Core Data在这些情况下所做的),存储和从Core Data获取数据可能会很快导致代价高昂。如果它们没有被压缩,它们也可以占用磁盘上明显更大的空间(这进一步降低了性能)。如果您需要更快的备选方案,请使用更适合此任务的商店,例如Tokyo CabinetLevelDB,并将核心数据存储中的实体用作一种替代品,例如包含资源的密钥那些关系数据库。

+0

我使用机制(无效)与'NSFileManager'方法。大量的数据。感谢罗伯特的投入。 – Peres