【问题标题】:Unable to get custom RKBlockValueTransformer to work properly with RestKit无法让自定义 RKBlockValueTransformer 与 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

标签: ios swift restkit restkit-0.20


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 2020-11-09
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多