Не удалось заставить пользовательский RKBlockValueTransformer правильно работать с RestKit

Я пытаюсь реализовать пользовательские преобразователи значений в проекте 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...)?

Почему validationBlocks никогда не вызываются для пользовательских преобразователей значений?

И почему установка valueTransformer на RKRelationshipMapping никак не влияет?

Документации RestKit, к сожалению, не хватает, когда речь идет о расширенном использовании пользовательских преобразователей значений...


person Jonathan Ellis    schedule 23.03.2015    source источник
comment
Когда вы устанавливаете преобразователь стоимости? Что, по словам ведения журнала трассировки, он делает, когда пытается принудительно передать полученные данные целевому объекту?   -  person Wain    schedule 24.03.2015
comment
В моем случае вызывается validationBlock. Проблема может быть связана с конфигурацией podfile. См. этот сообщение   -  person EPerrin95    schedule 27.03.2015


Ответы (1)


Недавно я столкнулся с этой проблемой и обнаружил, что это произошло из-за того, что я добавил преобразование после добавления сопоставлений. Как только я добавил его до отображения, было вызвано преобразование.

person Paul Curtis    schedule 01.01.2019