我试图将核心数据中的自定义类数组保存为可转换属性,但在尝试加载保存的数据时不断收到以下错误:
NSSecureUnarchiveFromData transformer> threw while decoding a value. ({
NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=4864 \"value for key 'NS.objects' was of unexpected class 'MyCustomClass'
在核心数据模式中,我将转换器设置为“NSSecureUnarchiveFromData”,将自定义类设置为“NSArray”(因为我想保存“MyCustomClass”数组)
MyCustomClass.h
@interface MyCustomClass : NSObject <NSSecureCoding>
@property (nonatomic, assign) NSString *identifier;
我的自定义类.m
@implementation MyCustomClass
+ (BOOL)supportsSecureCoding {
return YES;
}
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
[coder encodeObject:self.identifier forKey:@"Identifier"];
}
- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
if (self = [super init]) {
self.identifier = [coder decodeObjectOfClass:[NSString class] forKey:@"Identifier"];
}
return self;
}
我什至尝试将“MyCustomClass + CoreDataProperties”中的属性声明更改为NSArray
请问我错过了什么步骤或做错了什么?
我错过了几个步骤。除了问题中的代码之外,还必须执行以下操作才能使其正常工作:
• 在模型编辑器中将属性的自定义类更改为 NSArray
• 创建一个名为 MyCustomClassTransformer 的新类:
@interface MyCustomClassTransformer: NSSecureUnarchiveFromDataTransformer {}
@end
@implementation MyCustomClassTransformer
+ (Class)transformedValueClass {
return [MyCustomClassTransformer class];
}
+ (BOOL)allowsReverseTransformation {
return YES;
}
+ (NSArray<Class> *)allowedTopLevelClasses {
return @[[MyCustomClass class], [NSArray class]];
}
@end
• 在 AppDelegate 的“didFinishLaunchingWithOptions”中注册新的转换器:
MyCustomClassTransformer *transformer = [MyCustomClassTransformer new];
[NSValueTransformer setValueTransformer:transformer forName: @"MyCustomClassTransformer"];