我有一些简单的结构数组,我想打包到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格式中,也不是最有效的。其他人是否采用了这种方法,或者是否知道我没有考虑过涉及到的重大缺陷或影响?简而言之,这是一种合理的方法吗?
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文档。