I have a CoreData entity with a transformable property data that stores an NSDictionary. All of the classes inside the dictionary conform to NSSecureCoding
I have been getting many instances of this warning :
'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release
In trying to clean up the warning and future-proof my app, but I am running into a lot of trouble.
My understanding is that using NSKeyedUnarchiveFromData as the transformer in my data properties attribute should work, since the top level class is a dictionary and all of the contents conform to NSSecureCoding.
However, my data dictionary is now coming back as NSConcreteMutableData so I cannot access the data in it.
I have also tried creating a custom value transformer with additional allowedTopLevelClasses, but that hasn't helped, and again, the topLevel type is an NSDictionary, which should be allowed.
Thank you for any guidance.
Thanks. The relevant piece that I was missing is that it's not just the literal topLevelClasses that need to be registered with the NSSecureUnarchiveFromDataTransformer, but also any classes contained in the transformable if it's a collection. Therefore, if my NSDictionary has a custom class inside it, I need to register a subclass of NSSecureUnarchiveFromDataTransformer to allow that class.
@objc
class DataTransformer: NSSecureUnarchiveFromDataTransformer {
static let name = NSValueTransformerName(rawValue: String(describing: DataTransformer.self))
@objc(registerValueTransformer)
public static func register() {
let transformer = DataTransformer()
print(DataTransformer.allowedTopLevelClasses)
ValueTransformer.setValueTransformer(transformer, forName: name)
}
override class var allowedTopLevelClasses: [AnyClass] {
var topLevelClasses = super.allowedTopLevelClasses
let myClasses = [MyClass.self, MyOtherClass.self]
topLevelClasses.append(contentsOf: myClasses)
return topLevelClasses
}
}