无法让自定义 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...)?

为什么从来没有为自定义值转换器调用validationBlocks?

为什么在RKRelationshipMapping 上设置valueTransformer 没有任何效果?

遗憾的是,RestKit 文档在自定义值转换器的高级使用方面相当缺乏......

【问题讨论】:

您什么时候安装价值变压器?当它试图将接收到的数据强制到目标对象时,跟踪日志会说什么? 在我的例子中,调用了“validationBlock”。问题可能是由于 podfile 配置造成的。看到这个post 【参考方案1】:

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

【讨论】:

以上是关于无法让自定义 RKBlockValueTransformer 与 RestKit 一起正常工作的主要内容,如果未能解决你的问题,请参考以下文章

无法让自定义 url 方案在 iOS 中工作

无法让自定义对话框与 DirtyForms 一起使用

无法让自定义的活动指示器生成动画

让自定义视图仅向下移动

让自定义类的成员读取他们的值

让自定义列表适配器正确膨胀多个线性布局