Vla*_*kov 6 xcode core-data swift
我已经看到这篇文章,它有同样的警告,但我已经有了这种方法,但它现在在 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)
}
}
Run Code Online (Sandbox Code Playgroud)
它被设置为核心数据实体的“Transformer”:
这会导致 Xcode 15 中出现以下警告:
/Users/..../CoreData:1:1 实体“MyTestObject”上的属性“testDate”没有找到类名为“CustomSecureUnarchiveFromDataTransformer”的 NSValueTransformer
应用程序工作正常,没有任何问题,但显示此警告。
这是一个示例项目。
我找到了一个解决方案。\n它\xe2\x80\x99是一个解决方法,因为我们\xe2\x80\x99正在处理的行为显然是momc.
我的解决方案是从模型中属性的转换器名称属性中删除转换器名称,并将其设置在属性的用户信息中。然后,在检索模型时,对其进行后处理以在具有用户信息的属性上设置转换器名称。
\n它\xe2\x80\x99很难看,但它有效,而且作为奖励,我可以在运行时断言变压器确实存在。
\n配置需要变压器的属性,如下所示:
\n
\n然后,在代码中执行以下操作:
let model = NSManagedObjectModel(contentsOf: Bundle.main.url(forResource: "MyModel", withExtension: "momd")!)!\n/* Let\xe2\x80\x99s workaround the momc bug where it prints a warning for non-existent transformers but it\xe2\x80\x99s lying. */\nlet transformerUserInfoKey = "frz-transformer"\nfor entity in model.entities {\n for property in (entity.properties.compactMap{ $0 as? NSAttributeDescription }) {\n if let transformerName = property.userInfo?[transformerUserInfoKey] as! String? {\n assert(ValueTransformer(forName: .init(transformerName)) != nil)\n property.userInfo?.removeValue(forKey: transformerUserInfoKey)\n property.valueTransformerName = transformerName\n }\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n注意:我首先尝试了MOMC_NO_WARNINGS构建设置,但显然不再支持它。
\n