【发布时间】: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...)?
为什么从来没有为自定义值转换器调用validationBlocks?
为什么在RKRelationshipMapping 上设置valueTransformer 没有任何效果?
遗憾的是,RestKit 文档在自定义值转换器的高级使用方面相当缺乏......
【问题讨论】:
-
您什么时候安装价值变压器?当它试图将接收到的数据强制到目标对象时,跟踪日志会说什么?
-
在我的例子中,调用了“validationBlock”。问题可能是由于 podfile 配置造成的。看到这个post
标签: ios swift restkit restkit-0.20