【发布时间】:2010-05-21 22:35:09
【问题描述】:
我正在尝试将 PNG 图像存储在由 sqlite 数据库支持的核心数据存储中。因为我打算在 iPhone 上使用这个数据库,所以我不能直接存储 NSImage 对象。我想使用绑定和NSValueTransformer 子类来处理从NSImage(通过我的GUI 上的图像井获得)到包含图像的PNG 二进制表示的NSData 的转码。我为NSValueTransformer 编写了以下代码:
+ (Class)transformedValueClass
{
return [NSImage class];
}
+ (BOOL)allowsReverseTransformation
{
return YES;
}
- (id)transformedValue:(id)value
{
if (value == nil) return nil;
return [[[NSImage alloc] initWithData:value] autorelease];
}
- (id)reverseTransformedValue:(id)value
{
if (value == nil) return nil;
if(![value isKindOfClass:[NSImage class]])
{
NSLog(@"Type mismatch. Expecting NSImage");
}
NSBitmapImageRep *bits = [[value representations] objectAtIndex: 0];
NSData *data = [bits representationUsingType:NSPNGFileType properties:nil];
return data;
}
模型有一个使用此NSValueTransformer 配置的可转换属性。在 Interface Builder 中,表格列和图像井都绑定到此属性,并且都具有正确的值转换器名称(放置在图像井中的图像显示在表格列中)。每次添加图像或重新加载行时都会注册并调用转换器(通过NSLog() 调用进行检查)。当我尝试保存托管对象时会出现问题。控制台输出显示错误消息:
[NSImage 长度]:无法识别的选择器发送到实例 0x1004933a0
似乎核心数据正在使用值转换器从NSData 获取NSImage,然后尝试保存NSImage 而不是NSData。
可能有一些解决方法,例如this post 中提出的解决方法,但我真的很想了解为什么我的方法有缺陷。
提前感谢您的想法和解释。
【问题讨论】:
标签: objective-c image sqlite core-data cocoa-bindings