gpt4 book ai didi

core-data - 将 NSValueTransformer 更改为 NSSecureUnarchiveFromDataTransformer 以获取核心数据警告

转载 作者:行者123 更新时间:2023-12-05 06:51:16 30 4
gpt4 key购买 nike

在我的 Core Data 模式中,我在实体中有一个“可转换”属性,它使用 NSValueTransformer,其目的是通过一些压缩将 UIImage 转换为 NSData。从这个属性,我最近开始收到关于使用 NSKeyedUnarchiveFromData 的警告:

'NSKeyedUnarchiveFromData' should not be used to for un-archiving andwill be removed in a future release

所以我读到了这个 (link) 并认为我需要将 NSValueTransformer 更改为使用 NSSecureUnarchiveFromDataTransformer ...但是在进行更改之后(如最好是我从文章中理解它们)我无法让它工作,现在应用程序在访问该属性时崩溃。

这是现有的NSValueTransformer:

@interface ImageToDataTransformer : NSValueTransformer {
}

@implementation ImageToDataTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}

+ (Class)transformedValueClass {
return [NSData class];
}

- (id)transformedValue:(id)value {
// for our smaller views this uses much less data and makes for faster syncing
NSData *compressedData = UIImageJPEGRepresentation(value, 0.4);
return compressedData;
}

- (id)reverseTransformedValue:(id)value {
UIImage *uiImage = [[UIImage alloc] initWithData:value];
NSData *data = (NSData *) value;
//NSLog(@"reverseTransformedValue: image size: %@", [NSByteCountFormatter stringFromByteCount:data.length countStyle:NSByteCountFormatterCountStyleFile]);
return uiImage;
}

所以我将其更改为 NSSecureUnarchiveFromDataTransformer 的子类,并将以下内容添加到实现中:

+ (NSArray<Class> *)allowedTopLevelClasses {
return @[[ImageToDataTransformer class]];
}

+ (void)setValueTransformer:(nullable NSValueTransformer *)transformer forName:(NSValueTransformerName)name {
NSLog(@"ImageToDataTransfer: calling setValueTransformer");
[NSValueTransformer setValueTransformer:transformer forName:name];
}

+ (NSArray<NSValueTransformerName> *)valueTransformerNames {
return @[@"ImageToDataTransformerName"];
}

然后,在访问核心数据持久存储之前,我“注册”了转换器:

[ImageToDataTransformer setValueTransformer: [[ImageToDataTransformer alloc] init] forName:@"ImageToDataTransformerName"];

现在警告消失了,但是当读取图像时应用程序崩溃了:

-[__NSCFData _rasterizedImage]: unrecognized selector sent to instance 0x7ff53c108800

如果我将转换器改回 NSValueTransformer,它工作正常。所以我不确定我是否在实现中遗漏了一些东西,或者我误解了“NSSecureUnarchiveFromDataTransformer”的前提。很想知道我能做些什么来解决这个问题。

最佳答案

我认为您不需要覆盖 +valueTransformerNames+setValueTransformer:forName: 类方法。

从文档看来它们不应该被覆盖,因为第一个类方法将返回在调用时实际注册的值转换器名称。第二种方法是你如何实际注册你的值(value)转换器。所以你应该删除这两个覆盖的方法。

您可以在您的应用中发生任何其他事情之前,在您的值转换器的 +load 类方法中注册您的值转换器,如下所示:

NSValueTransformerName const ImageToDataTransformerName = @"ImageToDataTransformer";

+ (void)load
{
[ImageToDataTransformer setValueTransformer:[[ImageToDataTransformer alloc] init]
forName:ImageToDataTransformerName];
}

然后你覆盖+allowedTopLevelClasses来返回允许的顶级可转换类,它只是UIImage类如下:

+ (NSArray<Class> *)allowedTopLevelClasses
{
return @[[UIImage class]];
}

然后在您的 Core Data 架构中将 UIImage 作为可转换属性的自定义类,并将 ImageToDataTransformer 作为值转换器名称。

让我们知道它是否有效。

关于core-data - 将 NSValueTransformer 更改为 NSSecureUnarchiveFromDataTransformer 以获取核心数据警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66199719/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com