CoreData崩溃错误Xcode 11 Beta,IOS 13 Beta

Але*_*кий 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的子类。

Sir*_*rOz 13

我找到了这个解决方案。错误已消失,并且似乎可以正常运行。我一直在测试。

对于我已设置的所有Trasformable属性

编辑:

经过几天的测试,我在以前的解决方案中添加了一些内容。

如果在更改后删除了该应用程序,则可以使用先前的解决方案。否则,将无法识别数据模型并从头开始创建数据模型,从而丢失所有历史信息(在生产中这是不可接受的!!!)。

我采用的最终解决方案是将这些更改添加到新模型中(在此链接之后)并实现迁移(始终在链接中进行描述)。

在这种情况下,警告仅在更新后出现一次,然后消失。


kas*_*kad 8

我的解决方案是使用旧的默认转换器以避免任何兼容性问题。由于默认 (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)

之后,我为可转换字段设置了这些转换器,从而明确选择了最安全的方式。该解决方案的优点:您无需费心进行数据迁移,只需实现显式转换器并将它们设置为您已有的任何数据模型版本即可。