【问题标题】:iOS: best way to encode/decode memory intensive objectsiOS:编码/解码内存密集型对象的最佳方式
【发布时间】:2011-12-01 14:41:41
【问题描述】:

我是 iOS 编程的新手,正在努力决定使用 NSCoding 协议对内存密集型对象进行编码的最佳方法。

我有大量的 Item 对象。每个项目都有许多与之相关的高分辨率图像。此外,每个 Item 都属于一个 ItemCategory,其中可能包含 100 个 Item。

据我所知,我有几个不同的编码选项:

  1. 对整个 ItemCategory 对象进行编码
  2. 消除 ItemCategory 类,只为每个 Item 创建一个 itemCategory 属性,然后对各个 Item 对象进行编码。

在我看来,#1 会非常昂贵。为了向 ItemCategory 添加一个新项目,我必须解码整个 ItemCategory(这意味着也解码与它包含的项目相关的数百个图像),添加项目,然后重新编码整个事物(同样,连同所有这些图像)。

但是,从代码结构的角度来看,#1 似乎是正确的方法。 #2 迫使我想出一种不太直观的方式来存储项目并将它们与各自的 ItemCategories 相关联。

如果我使用#1,有没有办法只解码对象的某些部分,这样当我实际上不需要显示它们时,我就不会初始化所有这些图像?我想到的一个想法是实际上不将 Item 的 UIImages 与 Item 本身一起编码,而只是图像名称。这样,图像只会在必要时被初始化,并且可以在需要时释放而不释放整个项目。我想这是一种关系数据库类型的方法。

我觉得必须有一个标准的方法来处理这种情况,不是吗?

或者我对内存消耗的恐惧是没有根据的?也许这可以看作是“过早优化”的一个例子,但我现在做出的决定将深深地影响应用程序的数据结构。从选项 #1 更改为 #2 不会很漂亮:)

【问题讨论】:

    标签: objective-c ios cocoa-touch memory-management data-persistence


    【解决方案1】:

    也许你可以使用 CoreData 和一个 persistentStore。 CoreData 使管理关系变得容易。您可以创建具有由系统管理的关系的实体。因此,在您的情况下,也许您可​​以有 3 个实体:类别、项目和图像,以及类别和项目之间的一对多关系,以及项目和图像之间的一对多关系,这意味着每个类别可以有多个项目,并且每个项目都有多个图像,然后您可以在需要时创建新图像并将它们添加到特定项目,或者搜索项目中的所有图像。

    我希望这很清楚,但 CoreData 非常适合管理关系,并且数据模型非常易于使用。

    【讨论】:

    • 当我开始考虑在对 Item 对象编码时只对图像名称进行编码而不是对图像进行编码时,我肯定会想到这一点。事实是,我并不清楚何时使用 NSCoding 与 CoreData 更好。你能详细说明一下吗?因为看起来我可以使用 NSCoding 创建这些关系,所以我并没有真正掌握 CoreData 将提供的优势。
    • CoreData 在数据库之上实现。这里的相关特性是它会根据需要在对象中出错。
    • @maxedison 我认为这两种方法都可以实现相同的目标。 NSCoding 易于实现,但我认为 CoreData 更易于查询,因此您可以轻松地从特定类别的项目中获取一张图像。但是 Core Data 可能有点复杂,使用它时我发现它更难更改,但它对我来说尤其有用,因为对于我的应用程序关系很重要,CoreData 隐式处理,这是另一个好处。
    • 谢谢大家。在做出决定之前,我将开始学习 Core Data。
    猜你喜欢
    • 2010-11-26
    • 2021-04-25
    • 1970-01-01
    • 2014-01-02
    • 2010-11-18
    • 2010-12-31
    • 1970-01-01
    • 2011-02-08
    • 2013-01-18
    相关资源
    最近更新 更多