核心数据:没有为自定义“NSSecureUnarchiveFromDataTransformer”的实体 ZZZ 上的属性 YYY 找到类名为 XXX 的 NSValueTransformer

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

我已经看到了 this 帖子,它大约有相同的警告,但我已经有了这种方法,但它现在在 iOS 17 和 Xcode 15 中并没有解决这个问题。

我的用例非常简单,我有这个自定义变压器:

@objc(CustomSecureUnarchiveFromDataTransformer)
final class CustomSecureUnarchiveFromDataTransformer: NSSecureUnarchiveFromDataTransformer {
    
    override class var allowedTopLevelClasses: [AnyClass] {
        return [NSDateComponents.self]
    }
    
    static let name = NSValueTransformerName(rawValue: String(describing: CustomSecureUnarchiveFromDataTransformer.self))
    
    public static func register() {
        let transformer = CustomSecureUnarchiveFromDataTransformer()
        ValueTransformer.setValueTransformer(transformer, forName: name)
    }
}

设置为核心数据实体的“Transformer”:

这会导致 Xcode 15 中出现以下警告:

/Users/..../CoreData:1:1 没有带有类名的 NSValueTransformer 找到属性“CustomSecureUnarchiveFromDataTransformer” 实体“MyTestObject”上的“testDate”

应用程序工作正常,没有任何问题,但显示此警告。

这里是一个示例项目。

swift xcode core-data
1个回答
0
投票

我找到了解决办法。 这是一种解决方法,因为我们正在处理的行为显然是

momc
中的错误。

我的解决方案是从模型中属性的转换器名称属性中删除转换器名称,并将其设置在属性的用户信息中。然后,在检索模型时,对其进行后处理以在具有用户信息的属性上设置转换器名称。

它很丑陋,但它有效,而且作为奖励,我可以在运行时断言变压器实际上do存在。

具体步骤

在需要变压器的地方配置属性,如下所示:

然后,在代码中执行以下操作:

let model = NSManagedObjectModel(contentsOf: Bundle.main.url(forResource: "MyModel", withExtension: "momd")!)!
/* Let’s workaround the momc bug where it prints a warning for non-existent transformers but it’s lying. */
let transformerUserInfoKey = "frz-transformer"
for entity in model.entities {
    for property in (entity.properties.compactMap{ $0 as? NSAttributeDescription }) {
        if let transformerName = property.userInfo?[transformerUserInfoKey] as! String? {
            assert(ValueTransformer(forName: .init(transformerName)) != nil)
            property.userInfo?.removeValue(forKey: transformerUserInfoKey)
            property.valueTransformerName = transformerName
        }
    }
}

注意:我首先尝试了 MOMC_NO_WARNINGS 构建设置,但显然不再支持它。

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