我已经看到了 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”
应用程序工作正常,没有任何问题,但显示此警告。
这里是一个示例项目。
我找到了解决办法。 这是一种解决方法,因为我们正在处理的行为显然是
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 构建设置,但显然不再支持它。