何时*不*使用Core Data的可转换类型Transformable?

14

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

例如,如果它是字符串数组,是否存在最大元素数量或字符串最大长度会导致显著的性能问题?


1
我不使用iPhone,但我确实处理SQLite:我的决定通常取决于数据将如何使用。关系(和单个实体)是否对使用至关重要,还是数据仅作为单个单位生成/消耗?(在“非嵌入式”环境中,我几乎总是专门主张规范化方法。) - user166390
@pst 关系并不重要,数据仅作为单个单位使用。 我更好奇的是数据有多大才会影响性能,并且最好对它们进行规范化处理。 - pixelfreak
2个回答

15
我想知道何时不应使用Transformable属性,而是应该创建另一个实体并使用To-many关系。

只有在绝对必要的情况下才应使用Transformable属性。它们不是方便或简化,而是一些情况下资源密集型的必要性。

您很少使用Core Data来存储像数组或字典之类的数据结构,因为Core Data主要用于建模/模拟而非存储/持久化。将数据结构转换为大量没有逻辑的数据块对建模数据来说有点毫无意义。

Transformable属性通常用于存储某个类,该类本身能够主动管理其所持有的数据,例如将UIImage转换以便您可以直接从UI存储中获取UIImage并返回一个完整的UIImage对象。

回答您的主要问题:

我更好奇数据有多大才会影响性能,并且最好将它们规范化。

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

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

我绝不会使用Core Data来存储转换后的字符串数组或类似内容。如果字符串没有逻辑并且只有几十个,那么你可能想直接将数组写入plist文件中。与搞乱Transformable属性相比,这将更快且更容易。

10

这实际上取决于您想如何使用 transformable 属性描述的数据。

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

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

该实体还有另一个关键优势,即它可以被惰性加载。对于 transformable 属性,每次对象 fault 时,应用程序都需要加载数据,这可能会导致显著的性能问题。如果您将一组对象编码为 transformable 属性,则即使在不需要时,读取磁盘上的数据也会对应用程序产生负担。

就大小而言,您可以在 blob 中保留任意数量的数据,它是无界限的。但这再次涉及到这种设计的性能影响,特别是在 iOS 设备上,I/O 的代价非常高昂,内存受限,您的应用程序可能根本无法将数据从存储器读取到内存中(人们曾试图将电影文件放入 CoreData SQLite 存储中)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接