RestKit .20.x 价值转换

Posted

技术标签:

【中文标题】RestKit .20.x 价值转换【英文标题】:RestKit .20.x value transformation 【发布时间】:2014-03-24 20:23:18 【问题描述】:

我是 ios 开发的新手,正在尝试在 RestKit 中进行一些自定义值转换,但我不知道该怎么做。我目前有两个问题:

    我有一个 base64 编码的图像,它以 JSON 消息从服务器返回。它采用以下格式。我使用 Core Data 作为后端持久存储,并且“图像”字段作为二进制数据 (NSData) 存储在 Core Data 中。当 RestKit 将 base64 编码的图像转换为 NSData 对象时,出现了问题,因为存储在 sqllite 数据库中的图像字节不正确,我无法重新显示图像。

    "images": [
     "id": 1,
     "recordId": 1,
     "status": "C",
     "type": "MUGSHOT",
     "format": "JPEG",
     "width": 50,
     "height": 50,
     "image": "/9j/4AAQSkZJRgABAQEBLAEsAA....",
     "createBy": "blah",
     "createDt": 1395683191483,
     "captureDevice": null
    ]
    
    自纪元以来的 createBy 日期以毫秒为单位,它没有被正确地转换为 NSDate 对象。我知道它期望值以秒为单位,我假设是什么导致了问题。

经过多次谷歌搜索,我发现 RKValueTransformer 将允许我为不同的类设置自定义转换(在我的情况下,我想为 NSDate 和 NSData 类设置一个自定义转换器。但是,RKBlockValueTransformer 类是在“自定义值转换”部分下引用的此处 (https://github.com/RestKit/RestKit/wiki/Object-Mapping) 对我来说似乎不存在。我正在使用 RestKit .20.3 并使用 CocoaPods 与此 Podfile 一起安装它:

    platform :ios, '7.0'
    pod 'RestKit', '~> 0.20.3'

我尝试将 pod 'RKValueTransformers', '~> 1.0.0' 添加到我的 Podfile 中,但这会导致一些编译器问题。另外,RKValueTransformers project 不只是 RestKit 中已经内置的价值转换功能的摘录吗?

使用 RKValueTransformer 获取我正在寻找的 NSDate 和 NSData 行为,我是否走在正确的道路上?如果是这样,我必须做什么才能将其包含在我的项目中?有没有更简单的方法可以让我的应用程序正确处理以二进制字段形式存储在 Core Data 中的 base64 编码图像?

编辑:这是我的 Pods 项目中的 RKValueTransformers.h 和 .m 文件。它似乎只是与日期格式化程序相关:

【问题讨论】:

您在尝试使用存储的NSData 创建图像时是否遇到任何错误? 没有错误,但是当我将 NSData 传递给 [UIImage imageWithData:] 时,返回的 UIImage 为 nil。 【参考方案1】:

如果您在 Core Data 中存储图像数据,您应该考虑勾选“允许外部存储”选项。

您想要的值转换器是将NSString 转换为NSData,中间需要base64。您需要创建一个符合< RKValueTransforming > 的类。因为您是从NSString 转换,所以您应该实现validateTransformationFromClass:toClass:,这样您就可以有效地拒绝目标不是NSData 的任何转换。

一旦你创建了你的类并在它的实例中(imageFormatter),安装它:

[[RKValueTransformer defaultValueTransformer] insertValueTransformer:imageFormatter atIndex:0];

同样的过程也适用于日期格式化程序。

【讨论】:

由于某种原因,我的工作区中没有 RKValueTransforming 协议或 RKValueTransformer 类。上面贴的是我用来安装RestKit的Podfile。我是否缺少其他附加功能或其他内容? 我实际上并没有使用 pods,你看到你的项目中包含了 RestKit 项目吗?您是否安装了所有依赖项? 是的,它包含在我的项目中,并且 Cocoapods 还安装了 ASNetworking 和其他依赖项目(见上面的截图)。哪个 .h 文件包含适合您的 RKValueTransforming 类? RestKit .20.3 文件的下载也不包括你之前在 RKValueTransformers.h 文件中提到的原型或类。 RKValueTransformers.h,第 26 行。我正在使用开发分支版本 0.21.0。大师在 0.22.0。 0.20.3 已经 9 个月大了……你需要更新 是的,这绝对是问题所在。 restkit.org 说最新版本是 .20.3,我将其放入我的 Podfile 中,因为我认为这是最新版本(我傻傻地假设他们会更新他们的网站?)。我改变了我的 Podfile 以使用 .22,它使用正确的 RKValueTransformer 下载了最新版本!非常感谢您的帮助,我相信我现在会走在正确的轨道上!

以上是关于RestKit .20.x 价值转换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 RestKit 0.20.x 中指定多任务支持?

无法让 RestKit 在 Xcode 4.6 中工作

RestKit - 实体映射属性转换

Restkit 属性映射失败的转换错误

JSONKit(在 RestKit 中)将 JSON 转换为 NSArray

RestKit valueTransformer 未被调用