在 iOS 12 中,Apple 引入NSSecureUnarchiveFromDataTransformerName
了用于 CoreData 模型实体的 Transformable 属性。我曾经将 Transformer Name 字段保留为空,隐式使用NSKeyedUnarchiveFromDataTransformerName
. 该转换器现在已被弃用,并且将来保持该字段为空将意味着NSSecureUnarchiveFromDataTransformerName
取而代之。
在 iOS 13 中,如果该字段为空,您现在会收到运行时警告,告诉您上述内容。我在任何地方都找不到这方面的任何文档,我得到的唯一参考资料是 WWDC 2018 核心数据最佳实践演讲,其中简要提到了我刚才所说的内容。
现在我有一个带有实体的模型,该实体直接将HTTPURLResponse
对象存储在 Transformable 属性中。它符合,我在运行时NSSecureCoding
检查了.supportsSecureCoding
true
变压器名称的设置NSSecureUnarchiveFromDataTransformerName
因以下消息而崩溃:
Object of class NSHTTPURLResponse is not among allowed top level class list (
NSArray,
NSDictionary,
NSSet,
NSString,
NSNumber,
NSDate,
NSData,
NSURL,
NSUUID,
NSNull
) with userInfo of (null)
所以听起来 Transformable 属性只能是这些顶级对象。
我尝试按照文档的建议对安全转换器进行子类化并覆盖该allowedTopLevelClasses
属性:
@available(iOS 12.0, *)
public class NSSecureUnarchiveHTTPURLResponseFromDataTransformer: NSSecureUnarchiveFromDataTransformer {
override public class var allowedTopLevelClasses: [AnyClass] {
return [HTTPURLResponse.self]
}
}
然后我想我可以创建一个自定义转换器名称,在模型中设置它并调用该名称,但是如果我在 iOS 11 上,我setValueTransformer(_:forName:)
找不到 API 来为我的自定义名称设置默认值。NSKeyedUnarchiveFromDataTransformer
请记住,我使用的是 Xcode 11 Beta 5,但如果我要接受我所说的错误的含义,这似乎无关紧要。
欣赏任何想法。