在 Core Data 中保存自定义类数组

问题描述 投票:0回答:1

我试图将核心数据中的自定义类数组保存为可转换属性,但在尝试加载保存的数据时不断收到以下错误:

 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但得到了相同的错误。

请问我错过了什么步骤或做错了什么?

ios objective-c core-data
1个回答
2
投票

我错过了几个步骤。除了问题中的代码之外,还必须执行以下操作才能使其正常工作:

• 在模型编辑器中将属性的自定义类更改为 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"];
© www.soinside.com 2019 - 2024. All rights reserved.