无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作
Posted
技术标签:
【中文标题】无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作【英文标题】:Unable to get custom RKBlockValueTransformer to work properly with RestKit 【发布时间】:2015-03-23 21:55:02 【问题描述】:我正在尝试在我正在处理的 RestKit 项目中实现自定义值转换器。
我按如下方式设置了我的自定义第一个值转换器 (Swift):
// Join address components into a single string
let addressValueTransformer = RKBlockValueTransformer(validationBlock: (sourceClass, destinationClass) -> Bool in
return sourceClass.isSubclassOfClass(NSArray.self) && destinationClass.isSubclassOfClass(NSString.self)
) (inputValue, var outputValue, outputValueClass, error) -> Bool in
let address = inputValue as NSArray
let formattedAddress = address.componentsJoinedByString(", ")
outputValue.memory = formattedAddress
return true
如果我随后将其添加到 defaultValueTransformer()
,它将不起作用。甚至 validationBlock
也从未被调用过,这是一个谜。无论我将其添加到转换器数组的末尾还是开头,都不会调用验证块。
但是,如果我在RKAttributeMapping
上手动指定valueTransformer
属性,我至少可以让它工作:
let addressMapping = RKAttributeMapping(fromKeyPath: "location.formattedAddress", toKeyPath: "address")
addressMapping.valueTransformer = addressValueTransformer
placeMapping.addPropertyMapping(addressMapping)
但是,我现在想添加第二个值转换器,这一次是与另一个对象的一对一关系,结果证明这绝对是一场噩梦......
出于某种原因,在RKRelationshipMapping
上设置valueTransformer
(与上面的RKAttributeMapping
相对)无效。正如我已经提到的,将其安装为通用值转换器似乎也没有任何效果,这可以通过 validationBlock
甚至从未被调用的事实来证明。
也许我遗漏了一些关于价值转换器如何工作的关键信息,但我写了以下内容来测试是否可以调用任何价值转换器的validationBlock
:
let testValueTransformer = RKBlockValueTransformer(validationBlock: (sourceClass, destinationClass) -> Bool in
println("*** validationBlock ***")
return true
) (inputValue, var outputValue, outputValueClass, error) -> Bool in
println("*** transform ***")
return true
RKValueTransformer.defaultValueTransformer().insertValueTransformer(testValueTransformer, atIndex: 0)
RKValueTransformer.defaultValueTransformer().addValueTransformer(testValueTransformer)
根据我的理解,这绝对应该为每个值转换调用,但validationBlock
不会调用一次。
这里出了什么问题?这与我对 Swift 的使用有关吗(我已经必须确保我的对象明确继承 NSObject
...)?
为什么从来没有为自定义值转换器调用validationBlock
s?
为什么在RKRelationshipMapping
上设置valueTransformer
没有任何效果?
遗憾的是,RestKit 文档在自定义值转换器的高级使用方面相当缺乏......
【问题讨论】:
您什么时候安装价值变压器?当它试图将接收到的数据强制到目标对象时,跟踪日志会说什么? 在我的例子中,调用了“validationBlock”。问题可能是由于 podfile 配置造成的。看到这个post 【参考方案1】:我最近遇到这个问题,发现是因为我在添加映射后添加了转换。一旦我在映射之前添加它,就会调用转换。
【讨论】:
以上是关于无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章