繁体   English   中英

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

[英]CoreData crash error Xcode 11 Beta, IOS 13 Beta

我正在尝试在手机 IOS 13 Beta 上从 Xcode11 beta 构建我的应用程序。 应用程序加载时我崩溃了。

2019-07-22 13:58:12.910460+0300 GoodWine[3738:792501] [错误] 错误:此应用程序中的一个或多个模型正在使用转换器名称未设置或设置为 NSKeyedUnarchiveFromDataTransformerName 的可转换属性。 请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。 在某些时候,Core Data 将在指定 nil 时默认使用“NSSecureUnarchiveFromData”,并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。

CoreData:故障:此应用程序中的一个或多个模型正在使用转换器名称未设置或设置为 NSKeyedUnarchiveFromDataTransformerName 的可转换属性。 请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。 在某些时候,Core Data 将在指定 nil 时默认使用“NSSecureUnarchiveFromData”,并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。

2019-07-22 13:58:12.910595+0300 GoodWine[3738:792501] [错误] CoreData:此应用程序中的一个或多个模型正在使用转换器名称未设置或设置为 NSKeyedUnarchiveFromDataTransformerName 的可转换属性。 请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。 在某些时候,Core Data 将在指定 nil 时默认使用“NSSecureUnarchiveFromData”,并且包含不支持 NSSecureCoding 的类的可转换属性将变得不可读。

CoreData:警告:实体“SFMCKeyValueEntity”上的属性“value”正在使用 nil 或不安全的 NSValueTransformer。 请改用“NSSecureUnarchiveFromData”或 NSSecureUnarchiveFromDataTransformer 的子类。

我找到了这个解决方案。 错误已经消失,它似乎可以工作。 我一直在测试。

对于所有 Transformable 属性,我已在 Data Model Inspector 面板中将“Transformer”设置为“NSSecureUnarchiveFromData”。

在此处输入图片说明

编辑:

经过几天的测试,我在之前的解决方案中添加了一些东西。

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

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

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

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

对于符合 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)
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM