Я пытаюсь реализовать пользовательские преобразователи значений в проекте 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
s никогда не вызываются для пользовательских преобразователей значений?
И почему установка valueTransformer
на RKRelationshipMapping
никак не влияет?
Документации RestKit, к сожалению, не хватает, когда речь идет о расширенном использовании пользовательских преобразователей значений...