RestKit 自定义 RKValueTransformer 不是 运行 用于 NSDate 属性

RestKit custom RKValueTransformer not being run for NSDate property

我想在创建 特定请求 时 运行 在 NSDate 属性 上自定义 RKValueTransformer。我很高兴(并且更愿意)在所有其他情况下使用默认值。我的理解是我可以设置映射,指定一个值转换器,它会使用它,只有在没有设置值转换器的情况下才回退到默认值。我正在 运行宁 RestKit 0.23.3.

我为我的请求设置了以下映射(显然我已经从中删减了很多):

@property (nonatomic, retain) NSDate * dueDate;

...

+(RKEntityMapping *) createRequestMapping
{
    static RKEntityMapping* map = nil;
    if (map == nil)
    {
        map = (RKEntityMapping *)[RKObjectMapping requestMapping];
        [map addAttributeMappingsFromDictionary:...];

        RKValueTransformer *dueDateValueTransformer = [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class inputValueClass, __unsafe_unretained Class outputValueClass) {
            return [inputValueClass isSubclassOfClass:[NSDate class]];
        } transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputClass, NSError *__autoreleasing *error) {
            *outputValue = [[self dueDateRequestFormatter] stringFromDate:inputValue];
            return YES;
        }];
        RKAttributeMapping *dueDateMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"dueDate" toKeyPath:@"due_date"];
        dueDateMapping.valueTransformer = dueDateValueTransformer;
        [map addPropertyMapping:dueDateMapping];
    }
    return map;
}

当我测试这个 运行s 时,我可以看到使用了映射(因为目标键路径 "due_date" 存在于字典中),但值转换器不是 - 而是,似乎使用了默认的 NSDate 转换器:

    XCTAssertEqualObjects(@"2014-05-01", [item objectForKey:@"due_date"]);

-[RestKitCreateMappingTests testCreateSequenceMappings] failed: ((@"2014-05-01") equal to ([item objectForKey:@"due_date"])) failed: ("2014-05-01") is not equal to ("2014-05-01 00:00:00 +0000")

我在验证块和转换块中都设置了断点,但都没有命中。

为什么 RestKit 没有使用我的值转换器?

我必须指定 propertyValueClass 以便 RestKit 知道要映射到什么类型的目标 属性:

RKAttributeMapping *dueDateMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"dueDate" toKeyPath:@"due_date"];
dueDateMapping.valueTransformer = dueDateValueTransformer;
dueDateMapping.propertyValueClass = [NSString class];
[map addPropertyMapping:dueDateMapping];

没有这个,映射操作中的following check failed,它永远没有机会使用自定义值转换器,而只是输出输入值:

Class transformedValueClass = propertyMapping.propertyValueClass ?: [self.objectMapping classForKeyPath:propertyMapping.destinationKeyPath];
if (! transformedValueClass) {
    *outputValue = inputValue;
    return YES;
}
BOOL success = [propertyMapping.valueTransformer transformValue:inputValue toValue:outputValue ofClass:transformedValueClass error:error];
return success;