私はかなり単純なデータモデルを持つCore Dataアプリケーションを持っています。スペースを節約するために、永続ストアにNSImageのインスタンスをPNGビットマップNSDataオブジェクトとして格納できるようにしたいと考えています。変換可能なコアデータ属性がカスタムNSValueTransformerを使用しないのはなぜですか?
この目的のために、単純なNSValueTransformerを記述して、NSImageをPNGビットマップ形式のNSDataに変換しました。私は私のアプリデリゲートにこのコードの値変換を登録しています:
+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}
私のデータモデルでは、私が変換可能で画像の属性を設定し、値の変圧器名としてPNGDataValueTransformer
を指定しています。
ただし、私のカスタム値トランスフォーマは使用されていません。バリュー・トランスフォーマーの-transformedValue:
と-reverseTransformedValue
のログ・メッセージが記録されていないため、ディスクに保存されているデータはアーカイブされたNSImageであり、PNG NSDataオブジェクトではありません。
なぜこれが機能しないのですか?ここで
は私の価値変圧器のコードです:
@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
こんにちはブライアン、 '+ initialize'方法私のアプリデリゲートではなく、値変換であると私は間違いなくそれを確認することができますそれは呼ばれている。私のNSValueTransformerの '-init'メソッドにブレークポイントを置くと、確実に初期化されます。 属性を「バイナリ」タイプに設定し、IBの各バインディングにバリュートランスを適用すると、正常に動作します。属性型をTransformableとして指定すると、なぜカスタムトランスフォーマーが使用されていないのか分かりません。 –