据我所知,使用Transformable数据类型是在Core Data中存储数组或任何自定义对象的简便方法。我想知道什么时候应该不使用Transformable,而应该创建另一个实体并使用To-many关系。
假设它是一个字符串数组,是否有最大数量的元素或字符串的最大长度会导致严重的性能问题?
答案 0 :(得分:15)
我想知道什么时候不应该使用Transformable但是应该 而是创建另一个实体并使用To-many关系。
您绝对必须使用可转换的属性。在某些情况下,它们不是一种便利或捷径,而是一种资源密集型的必需品。
您很少使用Core Data来存储数组或字典之类的数据结构,因为Core Data主要用于存储/持久性,而不是用于建模/模拟。对数据建模来说,将数据结构变成一个无逻辑的大型数据博客是没用的。
可转换属性通常用于存储某些类,该类本身主动管理它所拥有的数据,例如:转换UIImage,以便您可以直接从UI存储中获取UIImage并将其全部整合回来。
回答你的主要问题:
我更好奇数据在影响之前有多大 性能,最好将它们标准化。
这主要取决于尺寸和复杂性的组合。每当您将一堆现有对象转换为数据blob时,您必须通过转换来阅读整个博客。因此,如果通过变换存储1mb数组,则在运行反向变换时会在内存中返回1mb数组。每次转换,无论多小,都比访问普通属性或甚至找到另一个托管对象需要更多的处理时间。因此,经常访问的大量小变换也会导致性能受到很大影响。
始终 更好地将大块数据分解为实体,属性和关系。这样做可以免费为您提供Core Data的所有灵活性和优化。我发现自己使用Core Data代替数组和字典,因为一旦你真正围绕Core Data,它就更容易使用。
我永远不会使用Core Data来存储转换后的字符串数组等。如果字符串没有逻辑并且只有几十个字符串,那么您也可以将数组写入plist文件。它比使用可转换属性更快捷,更容易。
答案 1 :(得分:9)
这实际上取决于您希望如何使用transformable属性描述的数据。
核心数据将在您的SQLite数据库中创建一个blob列,因此几乎不可能对该属性进行任何类型的实际搜索或排序。
相反,使用逻辑实体(通过多对多关系)描述要存储的数据将允许您使用搜索和排序功能。
该实体还有另一个关键优势,即它可以延迟加载,具有可转换属性,您的应用程序将消耗每次对象出错时加载该数据的成本。如果您将一组对象编码为可转换属性,则在将数据从磁盘上准备就绪时可能会导致严重的性能问题,即使您不需要它也是如此。
就尺寸而言,你可以在blob中保留尽可能多的数据,它是无限的。这再次归结为这种设计的性能影响,其中(特别是在iOS设备上)I / O非常昂贵并且内存受限制您的应用程序可能只是无法将数据读出存储区并进入内存(人们我曾尝试在CoreData SQLite商店中粘贴电影。)