Oldukça basit bir veri modeline sahip bir Core Data uygulamasına sahibim. Yerimi korumak için kalıcı depodaki PNG Bitmap NSData nesneleri olarak NSImage örneklerini depolayabilmek istiyorum.Dönüştürülebilir Temel Veri özniteliğim neden özel NSValueTransformer kullanmıyor?
Bu amaçla, PNG bitmap biçiminde bir NSImage'ı NSData'ya dönüştürmek için basit bir NSValueTransformer yazdım. Benim App temsilci bu kodla değer trafo kayıt ediyorum:
+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}
benim veri modelinde, ben Transformable olmaya görüntü özelliğini ayarlayın ve değer trafo adı olarak PNGDataValueTransformer
belirttiniz.
Ancak, özel değer dönüştürücüm kullanılmıyor. Günlük trafolarımın -transformedValue:
ve -reverseTransformedValue
yöntemlerinde günlüğe kaydedilmediğinden ve diske kaydedilmekte olan veriler sadece olması gereken PNG NSData nesnesinden ziyade arşivlenmiş bir NSImage olduğu için bunu biliyorum.
Bu neden çalışmıyor?
@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
Merhaba Brian, '+ initialize' yöntem benim app temsilci değil, değer trafo ve kesinlikle doğrulayabilirsiniz çağrılıyor. NSValueTransformer'imin '-init 'yöntemine bir kesme noktası koyarsam, kesinlikle başlatılır. Özniteliği "binary" türünde olacak şekilde ayarlıyorum ve IB'deki her bir bağlamaya benim değer dönüştürücümü uygularsam, iyi çalışır. Özellik türünü Dönüştürülebilir olarak belirttiğimde neden özel transformatörün kullanılmadığını anlamıyorum. –