【问题标题】:When *not* to use Core Data type Transformable?什么时候*不*使用核心数据类型可转换?
【发布时间】:2011-10-10 14:49:32
【问题描述】:

我知道使用 Transformable 数据类型是一种在 Core Data 中存储数组或任何自定义对象的简单方法。我想知道什么时候应该使用 Transformable 而应该创建另一个实体并使用多对多关系。

如果它是一个字符串数组,是否存在最大元素数或最大字符串长度会导致严重的性能问题?

【问题讨论】:

  • 我不使用 iPhone,但我使用 SQLite:我的决定通常归结为 如何 使用数据。关系(和个体实体)是使用的基础还是数据仅作为一个单元产生/使用? (在“非嵌入式”环境中,我几乎总是只支持规范化方法。)
  • @pst 关系不重要,数据仅作为单个单元使用。我更好奇数据可以有多大,直到它影响性能并且最好将它们标准化。

标签: iphone objective-c ios ipad core-data


【解决方案1】:

我想知道什么时候不应该使用 Transformable 而应该 而是创建另一个实体并使用多对多关系。

您应该只在绝对必要时使用可转换属性。在某些情况下,它们不是一种便利或捷径,而是一种资源密集型的必需品。

您很少使用 Core Data 来存储数组或字典等数据结构,因为 Core Data 主要不是用于存储/持久性,而是用于建模/模拟。对数据进行建模以将数据结构变成一个大的、无逻辑的数据博客是没有用的。

可转换属性通常用于存储某些类,这些类本身主动管理其持有的数据,例如转换 UIImage 以便您可以直接从 UI 存储中获取 UIImage 并将其全部取回。

回答您的主要问题:

我更好奇数据在影响之前可以有多大 性能,最好将它们标准化。

这主要取决于大小和复杂性的组合。每当您将一堆现有对象转换为数据块时,您都必须通过转换读取整个博客。因此,如果您通过转换存储一个 1mb 数组,则在运行反向转换时您会在内存中返回一个 1mb 数组。每次转换,无论多么小,都比访问普通属性甚至查找另一个托管对象花费更多的处理时间。因此,拥有大量经常访问的小型转换也会导致相当大的性能损失。

总是最好将大块数据分解为实体、属性和关系。这样做可以免费为您提供 Core Data 的所有灵活性和优化。我发现自己使用 Core Data 来代替数组和字典,因为一旦你真正了解 Core Data,它就会更容易使用。

我永远不会使用 Core Data 来存储转换后的字符串数组等。如果字符串没有逻辑并且只有几十个,您不妨将数组写入 plist 文件。这将比使用可变形属性更快更容易。

【讨论】:

    【解决方案2】:

    这实际上归结为您希望如何使用可转换属性所描述的数据。

    Core Data 将在您的 SQLite 数据库中创建一个 blob 列,因此几乎不可能对属性进行任何类型的真正搜索或排序。

    相反地,用逻辑实体(通过一对多关系)描述您想要存储的数据将允许您利用搜索和排序功能。

    实体还有另一个关键优势,即它可以延迟加载,使用可转换属性,您的应用程序将在每次对象出现故障时消耗加载该数据的成本。如果您将一组对象编码为可转换属性,这可能会在您从磁盘上准备好数据时导致严重的性能问题,即使您不需要它。

    就大小而言,您可以在 blob 中保留任意数量的数据,它是无限的。这又归结为这种设计对性能的影响,其中(尤其是在 iOS 设备上)I/O 非常昂贵并且内存受到限制,您的应用程序可能根本无法将数据从存储中读取到内存中(人们已尝试在 CoreData SQLite 商店中粘贴电影)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-30
      • 2019-03-01
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多