将CoreData属性存储为(可编码)数据,而不是(NSCoding)可变形物

问题描述 投票:1回答:1

我有一些简单的结构数组,我想打包到Core Data属性中。我不需要Core Data来独立处理每个对象,因此在一个属性上打包到数组中似乎没问题,开销也更少。

完整的解决方案可能是投放我自己的NSValueTransformer。我将完全控制流程和存储。但是,撇开[[more work,自Swift 4起,我们现在有效地采用了另一种即用即用的序列化方法-将对象存储为Data属性,并通过Swift 4的Codable协议进行序列化(例如)JSONEncoder/ JSONDecoder实现。这是使用通过NSValueTransformer下的默认NSCoding序列化的Transformable属性的更典型方法的替代方法。

一个直接的优点是不必继承NSObject并遵循NSCoding,对于我而言,这是简单的值类型。仅此一点就使我想开始使用Codable作为默认方法。显然,使用JSON编码器将意味着utf8下数据的转换和表示,即使Core Data / sqlite将其视为Data / BLOB。但是,从我收集的默认转换器到(二进制)plist格式中,也不是最有效的。

其他人是否采用了这种方法,或者是否知道我没有考虑过涉及到的重大缺陷或影响?简而言之,这是一种合理的方法吗?

swift core-data nscoding codable
1个回答
0
投票
我不知道您是否仍在寻找解决此问题的方法,但这是我使用的解决方案的概述。假设aStruct: Codable,则可以使用此策略。

在核心数据模型中,我为所需实体创建了一个属性,例如类型数据的encodedStructArray

然后在该实体的swift扩展中,我创建了一个具有普通swift类型的计算的读写var:

var structArray: [aStruct] { get { guard let data = encodedStructArray else { return [] } guard let result = try? JSONDecoder().decode([aStruct].self, from: data) else { return [] } return result } set { encodedStructArray = try? JSONEncoder().encode(newValue) } }

现在,您可以像在任何地方一样使用var,但是出于性能方面的考虑,将其拉出并使用它,而不是直接在多个位置使用var,因为此示例不会缓存该值。

如果要缓存结果,则需要向数据模型添加一个暂态,名称为structArray,类型为undefined,并将缓存值保留在其原语中。有关示例,请参见Core Data文档。

© www.soinside.com 2019 - 2024. All rights reserved.