Але*_*кий 15 core-data core-data-migration swift ios13 xcode11
我试图在手机IOS 13 Beta上从Xcode11 beta构建我的应用程序。加载应用程序时发生崩溃。
2019-07-22 13:58:12.910460 + 0300 GoodWine [3738:792501] [错误]错误:此应用程序中的一个或多个模型使用的可变形属性的变压器名称未设置或设置为NSKeyedUnarchiveFromDataTransformerName。请改用“ NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。在某些时候,当指定nil时,Core Data将默认使用“ NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得不可读。
CoreData:错误:此应用程序中的一个或多个模型正在使用可变形的属性,且其变压器名称未设置或设置为NSKeyedUnarchiveFromDataTransformerName。请改用“ NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。在某些时候,当指定nil时,Core Data将默认使用“ NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得不可读。
2019-07-22 13:58:12.910595 + 0300 GoodWine [3738:792501] [错误] CoreData:此应用程序中的一个或多个模型使用的可变形属性的变压器名称未设置或设置为NSKeyedUnarchiveFromDataTransformerName。请改用“ NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。在某些时候,当指定nil时,Core Data将默认使用“ NSSecureUnarchiveFromData”,并且包含不支持NSSecureCoding的类的可转换属性将变得不可读。
CoreData:警告:实体“ SFMCKeyValueEntity”上的属性“值”正在使用nil或不安全的NSValueTransformer。请改用“ NSSecureUnarchiveFromData”或NSSecureUnarchiveFromDataTransformer的子类。
我的解决方案是使用旧的默认转换器以避免任何兼容性问题。由于默认 (nil) 转换器最终将被 NSSecureUnarchiveFromData 替换,因此可能会出现问题,我不确定以前持久化的值是否会被正确解码(它们由默认转换器编码,但更新后将由 NSSecureUnarchiveFromDataTransformer 解码)。我已经为符合 NSCoding 的 NSDictionary、NSArray、NSSet 基础类型的字段实现了一个显式的默认转换器:
@objc(DefaultTransformer)
class DefaultTransformer: ValueTransformer {
override class func transformedValueClass() -> AnyClass {
return NSData.self
}
override open func reverseTransformedValue(_ value: Any?) -> Any? {
guard let value = value as? Data else {
return nil
}
return NSKeyedUnarchiver.unarchiveObject(with: value)
}
override class func allowsReverseTransformation() -> Bool {
return true
}
override func transformedValue(_ value: Any?) -> Any? {
guard let value = value else {
return nil
}
return NSKeyedArchiver.archivedData(withRootObject: value)
}
}
Run Code Online (Sandbox Code Playgroud)
对于符合 NSCoding 的特殊数据类型,我实现了如下特定的转换器:
@objc(EmailTransformer)
class EmailTransformer: ValueTransformer {
override class func transformedValueClass() -> AnyClass {
return NSData.self
}
override open func reverseTransformedValue(_ value: Any?) -> Any? {
guard let value = value as? Data else {
return nil
}
return NSKeyedUnarchiver.unarchiveObject(with: value)
}
override class func allowsReverseTransformation() -> Bool {
return true
}
override func transformedValue(_ value: Any?) -> Any? {
guard let value = value as? [Email] else {
return nil
}
return NSKeyedArchiver.archivedData(withRootObject: value)
}
}
Run Code Online (Sandbox Code Playgroud)
之后,我为可转换字段设置了这些转换器,从而明确选择了最安全的方式。该解决方案的优点:您无需费心进行数据迁移,只需实现显式转换器并将它们设置为您已有的任何数据模型版本即可。