【问题标题】:Core Data vs NSFileManager核心数据与 NSFileManager
【发布时间】:2013-04-06 20:58:41
【问题描述】:

问题:

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

有关日内瓦 17/02/2013 天气的资源,因此我将有一个名为 GE_17_02_2013 的键和指向 NSDictionary 的路径的值以及该信息。

通常我不需要做任何复杂的查询。但是,不知何故,根据我一直在阅读的内容,当您拥有大量数据时,您应该坚持使用 Core Data。就我而言,我通常有很多数据,但我从来没有真正感觉到应用程序出现故障,或者在性能方面受到影响。所以我的问题是:

  1. 在这种情况下,有时(天气问题只是 例如)我只需要删除所有数据(Twitter 提要,对于 示例)并将其替换为全新的数据流,是 Core 数据值钱?我认为删除所有数据并插入(填充)它比仅存储 NSDictionary 并替换旧的要重。

  2. 有时它会包含图像、文本文件等,而 NSFileManager 做得很完美,那么Core能有什么优势 数据带来的这种情况?

P.S:我刚刚看到this 的帖子,其中提出了此类问题,并且数字证明了哪个实际上更快。不过,我也想要一个经验性的答案。

【问题讨论】:

    标签: ios objective-c core-data nsfilemanager


    【解决方案1】:

    Core Data 值得在您描述的每个场景中使用。事实上,如果一个应用程序存储的不仅仅是首选项,你可能应该使用 Core Data。以下是一些原因,其中,您会找到自己问题的答案:

    • 肯定比文件系统快,即使您清除所有内容并按照您的描述重新编写它(因此您不会从缓存中受益匪浅)。这基本上是因为您可以合并您的操作并仅在需要时访问商店。所以如果你读、写、读,你只能保存一次,其余的都在内存中完成,这不用说,非常快。
    • 一切都是版本化的,您可以轻松地从一个版本迁移到另一个版本(同时保留用户在设备上的内容)
    • 80% 的模型操作都是免费的。比如,当某些事情发生变化时,您可以覆盖 willSave 托管对象方法并通知您的控制器。
    • 使用 cascade 可以轻松删除非常复杂的对象结构
    • 虽然将图像保留在数据库中是一个坏主意,但您仍然可以将它们保留在文件系统中,并在代表它们的托管对象被删除时让核心数据自动删除它们
    • 非常灵活,实际上非常灵活,您可以通过编写自定义数据存储将您的项目从使用本地文件系统迁移到使用服务器,而只需很少的修改。
    • 核心数据设计器基本上为您创建模型对象。您不需要创建自己的模型类(如果使用文件系统,则必须这样做)

    【讨论】:

    • 缓存更多用于离线场景。所以在正常情况下可以上网的情况下,我通常会非常频繁地替换存储的数据,这就是我担心的原因。另一个优点是只使用NSDictionary 而不需要知道他的内心(他是如何组成的)。让NSManagedObject 只有NSDictionary 有意义吗?
    • 缓存对于本地文件系统也很重要。文件系统访问比内存访问慢得多。我不确定为什么你不需要知道那本字典里面有什么,你不要把它读/解释成某个点。如果你只像其他文件一样存储一个文件,恰好是一个序列化字典,那么是的,使用 Core Data 没有意义
    • 我的意思是,我知道里面有什么,但如果由于某种原因 API 发生了变化,并添加了不同的东西,我不受此限制。
    【解决方案2】:

    在这种情况下……Core Data 值得吗?

    是的,在某种程度上,您需要比尝试制定自己的文件系统架构更集中管理的东西。 Core Data 及其低级表亲 SQL 仍然是我们目前拥有的持久性的最佳选择。此外,使用NSKeyed(Un)Archiver 反复序列化/反序列化字典对性能的影响随着数据集的增大而变得越来越明显。

    我认为删除所有数据并插入(填充)它更重 而不仅仅是存储 NSDictionary 并替换旧的。

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

    有时它会包含图像、文本文件等以及 NSFileManager 做得很完美,那么 Core Data 有什么优势呢? 带上这种情况?

    不幸的是,数量不多。对于数据块(Core Data 在这些情况下本质上就是这样做的),存储和从 Core Data 读取数据很快就会变得昂贵。如果它们没有被压缩(这会进一步降低性能),它们也会在磁盘上占用明显更大的空间。如果您需要更快的替代方案,请使用更适合该任务的存储,例如 Tokyo CabinetLevelDB,并使用 Core Data 存储中的实体作为一种替代品,例如,包含这些关系数据库之一中的资源。

    【讨论】:

    • 我将该机制(失效)与NSFileManager 方法一起使用。拥有大量数据。感谢罗伯特的投入。
    猜你喜欢
    • 2018-01-08
    • 2017-11-24
    • 2015-10-06
    • 2013-04-21
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多