Tôi có ứng dụng Dữ liệu cốt lõi với mô hình dữ liệu khá đơn giản. Tôi muốn có thể lưu trữ các thể hiện của NSImage trong cửa hàng liên tục dưới dạng các đối tượng Nmap bitmap của PNG, để tiết kiệm không gian.Tại sao thuộc tính Dữ liệu cốt lõi có thể biến đổi của tôi không sử dụng NSValueTransformer tùy chỉnh của tôi?
Để kết thúc này, tôi đã viết một NSValueTransformer đơn giản để chuyển đổi một NSImage thành NSData ở định dạng bitmap PNG. Tôi đăng ký biến giá trị với mã này trong đại biểu App của tôi:
+ (void)initialize
{
[NSValueTransformer setValueTransformer:[[PNGDataValueTransformer alloc] init] forName:@"PNGDataValueTransformer"];
}
Trong mô hình dữ liệu của tôi, tôi đã thiết lập các thuộc tính hình ảnh là năng biến, và quy định PNGDataValueTransformer
như tên giá trị biến.
Tuy nhiên, biến áp giá trị tùy chỉnh của tôi không được sử dụng. Tôi biết điều này vì tôi đã đặt thông điệp tường trình trong các phương thức -transformedValue:
và -reverseTransformedValue
của trình biến đổi giá trị không được ghi lại và dữ liệu đang được lưu vào đĩa chỉ là một NSImage được lưu trữ chứ không phải đối tượng NSData PNG mà nó cần.
Tại sao tính năng này không hoạt động?
Đây là mã của biến giá trị của tôi:
@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
Hi Brian, các '+ initialize' phương pháp là ở đại biểu ứng dụng của tôi, không phải là biến giá trị và tôi chắc chắn có thể xác minh rằng nó đang được gọi. Nếu tôi đặt một điểm ngắt trong phương thức '-init' của NSValueTransformer, nó chắc chắn được khởi tạo. Nếu tôi đặt thuộc tính là loại "nhị phân" và áp dụng biến áp giá trị của tôi cho từng ràng buộc trong IB, nó hoạt động tốt. Tôi chỉ không hiểu tại sao biến tùy chỉnh không được sử dụng khi tôi chỉ định kiểu thuộc tính là Biến đổi. –