gpt4 book ai didi

objective-c - 为什么我的可转换核心数据属性没有使用我的自定义 NSValueTransformer?

转载 作者:太空狗 更新时间:2023-10-30 03:25:01 30 4
gpt4 key购买 nike

我有一个具有相当简单数据模型的 Core Data 应用程序。我希望能够将 NSImage 的实例作为 PNG Bitmap NSData 对象存储在持久存储中,以节省空间。

为此,我编写了一个简单的 NSValueTransformer 来将 NSImage 转换为 PNG 位图格式的 NSData。我在我的 App 委托(delegate)中使用此代码注册值转换器:

+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}

在我的数据模型中,我将图像属性设置为 Transformable,并将 PNGDataValueTransformer 指定为值转换器名称。

但是,我的自定义值转换器没有被使用。我知道这一点,因为我在我的值转换器的 -transformedValue:-reverseTransformedValue 方法中放置了日志消息,这些方法没有被记录,并且保存到磁盘的数据是只是一个存档的 NSImage,而不是它应该是的 PNG NSData 对象。

为什么这不起作用?

这是我的值(value)转换器的代码:

@implementation PNGDataValueTransformer

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

+ (BOOL)allowsReverseTransformation
{
return YES;
}

- (id)transformedValue:(id)value
{
if (value == nil) return nil;
if(NSIsControllerMarker(value))
return value;
//check if the value is NSData
if(![value isKindOfClass:[NSData class]])
{
[NSException raise:NSInternalInconsistencyException format:@"Value (%@) is not an NSData instance", [value class]];
}
return [[[NSImage alloc] initWithData:value] autorelease];
}

- (id)reverseTransformedValue:(id)value;
{
if (value == nil) return nil;
if(NSIsControllerMarker(value))
return value;
//check if the value is an NSImage
if(![value isKindOfClass:[NSImage class]])
{
[NSException raise:NSInternalInconsistencyException format:@"Value (%@) is not an NSImage instance", [value class]];
}
// convert the NSImage into a raster representation.
NSBitmapImageRep* bitmap = [NSBitmapImageRep imageRepWithData: [(NSImage*) value TIFFRepresentation]];
// convert the bitmap raster representation into a PNG data stream
NSDictionary* pngProperties = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:NSImageInterlaced];
// return the png encoded data
NSData* pngData = [bitmap representationUsingType:NSPNGFileType properties:pngProperties];
return pngData;
}

@end

最佳答案

如果我没记错的话,你的值(value)转换器有一个相反的方向。我在我的应用程序中做同样的事情,使用如下代码:

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

+ (BOOL)allowsReverseTransformation
{
return YES;
}

- (id)transformedValue:(id)value
{
if (value == nil)
return nil;

// I pass in raw data when generating the image, save that directly to the database
if ([value isKindOfClass:[NSData class]])
return value;

return UIImagePNGRepresentation((UIImage *)value);
}

- (id)reverseTransformedValue:(id)value
{
return [UIImage imageWithData:(NSData *)value];
}

虽然这是针对 iPhone 的,但您应该能够在适当的位置交换 NSImage 代码。我只是还没有测试我的 Mac 实现。

我所做的就是将我的图像属性设置为在数据模型中可转换,并指定转换器的名称。我不需要像您在 +initialize 方法中那样手动注册值转换器。

关于objective-c - 为什么我的可转换核心数据属性没有使用我的自定义 NSValueTransformer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598600/

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