为什么我的可转换核心数据属性不使用我的自定义 NSValueTransformer?

2024-03-04

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

为此,我编写了一个简单的 NSValueTransformer 将 NSImage 转换为 PNG 位图格式的 NSData。我正在我的应用程序委托中使用以下代码注册值转换器:

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

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

但是,我的自定义值转换器没有被使用。我知道这一点,因为我已将日志消息放入我的值转换器中-transformedValue: and -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

如果我没记错的话,你的价值转换器的方向是相反的。我在我的应用程序中做了同样的事情,使用如下代码:

+ (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 方法中那样手动注册值转换器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的可转换核心数据属性不使用我的自定义 NSValueTransformer? 的相关文章

随机推荐

  • CSS open-quote 显示 1 个引号

    我使用以下 CSS 在段落前添加左引号 blockquote padding 22px quotes 201C 201D 2018 2019 font size 15px blockquote before color 111 conten
  • Postgres:整数范围的唯一约束

    给定两个整数 开始和结束 以及一个外键 我如何定义一个unique对区间 start end 和foreign key 的约束 鉴于我的表中有以下条目 start end foreign key 10 20 04ef8258 917c 46
  • Java中如何获取字符类型的类别名称?

    The Character getType int codePoint 返回一个整数 但我找不到方法 从中获取 unicode 类别名称 例如 Lu 或 Cn 我想要的是一种方法 例如Character getCategoryTypeNam
  • scala 中的构造函数(主/辅助/默认主)

    一个非常简单的练习凯霍斯特曼的 book Scala 适合不耐烦的人 一直让我困惑 是关于primary auxiliary and default primary构造函数 例如 5 10 考虑班级 class Employee val n
  • 不会采用父级
  • 我有一个 ul 与几个 li 其中的所有项目都在一行中 这 li li 有一个嵌套的 span and an img The img 所有项目的高度都相同 但是 span 项目包含可以跨越单行或两行的文本 取决于文本 我尝试过申请displ
  • ParseException:无效的会话令牌错误

    我做了一个简单的注册用户界面只是为了检查解析 但由于某种原因每次我尝试注册用户时都会出现此错误 这是代码 final ProgressDialog dlg new ProgressDialog this dlg setTitle Pleas
  • Java 中的内存映射集合

    我正在填满 JVM 堆空间 更改参数以为 JVM 提供更多堆空间 或更改代码中算法中的某些内容以不使用这么多空间是最推荐的两个选项 但是 如果这两个已经被尝试和应用 并且我仍然遇到内存不足的异常 我想看看其他选项是什么 我发现了这个例子 对
  • 使用 Keras (PIL) 和 TensorFlow 调整图像大小不一致?

    我对以下之间明显的不一致感到困扰 图像调整大小功能来自keras preprocessing 它们是 PIL 函数的包装器 TensorFlow 中的图像大小调整函数tf image 我正在使用 Keras 为计算机视觉任务训练深度学习模型
  • 如何提高 PostgreSQL 中带有游标的函数的性能?

    我有两个嵌套游标的功能 外部游标从源获取客户的付款详细信息 并根据某些业务逻辑插入到目标中 内部光标获取每笔付款的付款详细信息 它接连发生 Payments 表大约有 125000 行 其中大约 335000 行用于付款详细信息 所有这些行
  • 使用两个具有相同字符的分解对象断言 True

    我有两个 unicode 字符 两者具有相同的含义 这compat字符是对origin字符 这有意义 两者应该是相同的值 但是当我试图断言它们与条件相等时 它会返回False反而 origin korean letter for AE co
  • 通过“sed”将破折号插入字符串

    我有包含数字的 14 个字符行 如何在特定位置 即第 4 个位置 插入一个字符 所以 如果我有这样的字符串 xxxxxxxxxxxxxx 我怎样才能把它改成这样 xxxx xx xxxxxxxx 其中 x 代表数字 谢谢 伊雷克 如果你的台
  • 即使配置 SSL 属性后,Spring RMQ 侦听器也始终使用 PLAIN 身份验证

    我有一个 Spring Boot 应用程序 我正在尝试将侦听器配置为已有的队列 以下是我在我的配置中配置的application yml文件 我还用注释注释了我的配置类 EnableRabbit和听众 RabbitListener参考 sp
  • 即使方向是横向,Android也会加载drawable而不是drawable-land?

    我有一个启动屏幕 在主屏幕之前显示图像几秒钟Activity启动 它有一个纵向版本 drawable hdpi splash 和一个横向版本 drawable land hdpi 启动画面设置方向onCreate 我的问题 如果我将平板电脑
  • 如何检测CSS3调整大小事件

    CSS3 resize 属性可以分配给任意元素 我正在寻找一种方法来检测 div 上的此类调整大小 我不介意它目前仅在 Firefox 中工作 div resize horizontal overflow hidden 不幸的是 onres
  • 为什么我在制作 Spring 项目时会收到​​ not Exposure to the weaver 警告?

    当我制作 Spring 项目时 我似乎收到了很多这样的警告 该项目使用编译时编织和各种 Spring 注释 例如 Transactional Autowired 和 Configurable 我有三个问题 它们是什么 有什么效果 我应该关心
  • 当我结合 UIPanGestureRecognizer 和自动布局时,我的 UIViews 搞砸了

    当我沿着圆形轨迹拖动手指时 我想要一个球来跟踪我的手指 以适应 iPhone 或 iPad 上每个允许的设备方向 当设备旋转时 视图似乎正确居中 但球不会停留在圆周上 并且当我拖动它时 它似乎会去任何地方 EDIT 马丁 R的回答 http
  • 如何下载特定谷歌云“服务”的代码

    This doc https cloud google com appengine docs python tools downloading source code显示下载我在应用程序引擎中拥有的应用程序源代码的命令 appcfg py
  • Spring MVC 在表单中选择值:表单验证错误后选择

    我的验证表单有问题 该表单有很多不同的字段 输入文本字段 选择选项 多重选择选项 我已经使用 Spring Security 开发了有关验证表单的所有逻辑源代码 但是当验证表单失败 例如 用户没有填写任何内容 并再次重新加载表单时 所有输入
  • 没有开发者许可证/应用商店的 iOS 应用

    我是 iPhone 开发新手 想知道是否有一个好的 简单的指南可以让我在不加入开发者计划的情况下在越狱手机上安装 iOS 应用程序 基本上 我不知道我是否有时间学习我需要学习的所有内容 但我想开始看看它会带来什么结果 一旦我有了一些像样的东
  • 为什么我的可转换核心数据属性不使用我的自定义 NSValueTransformer?

    我有一个核心数据应用程序 具有相当简单的数据模型 我希望能够将 NSImage 实例作为 PNG Bitmap NSData 对象存储在持久存储中 以节省空间 为此 我编写了一个简单的 NSValueTransformer 将 NSImag