无法使自定义RKBlockValueTransformer与RestKit一起正常工作

时间:2015-03-23 21:55:03

标签: ios swift restkit restkit-0.20

我正在尝试在我正在研究的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文档在高级使用自定义值变换器方面缺乏...

1 个答案:

答案 0 :(得分:0)

我最近遇到这个问题,发现那是因为我在添加映射后添加了转换。一旦在映射之前添加它,就调用了转换。