我正在尝试在我正在研究的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
也从未被调用,这是一个谜。无论是将其添加到变换器数组的末尾,还是在开头,都不会调用验证块。
但是,如果我在valueTransformer
上手动指定RKAttributeMapping
属性,我至少可以让它工作:
let addressMapping = RKAttributeMapping(fromKeyPath: "location.formattedAddress", toKeyPath: "address")
addressMapping.valueTransformer = addressValueTransformer
placeMapping.addPropertyMapping(addressMapping)
但是,我现在想要添加第二个值变换器,这次与另一个对象建立一对一的关系,这真是一场绝对的噩梦......
出于某种原因,在valueTransformer
上设置RKRelationshipMapping
(而不是上面的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
?
为什么不在valueTransformer
上设置RKRelationshipMapping
会产生任何影响?
遗憾的是,RestKit文档在高级使用自定义值变换器方面缺乏...
答案 0 :(得分:0)
我最近遇到这个问题,发现那是因为我在添加映射后添加了转换。一旦在映射之前添加它,就调用了转换。