RestKit自定义RKValueTransformer没有为NSDate属性运行

时间:2015-04-11 02:32:54

标签: ios restkit

我想在创建特定请求时在RKValueTransformer媒体资源上运行自定义NSDate。我很高兴(并且更愿意)在所有其他场景中使用默认值。我的理解是我可以设置映射,指定一个值变换器并且它将使用它,如果没有设置值变换器,则只返回默认值。我正在运行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;
}

当我的测试运行时,我可以看到使用了映射(因为字典中存在目标键路径“due_date”),但值变换器不是 - 而是显示为默认{{1}使用变压器:

NSDate
  

- [RestKitCreateMappingTests testCreateSequenceMappings]失败:((@“2014-05-01”)等于([item objectForKey:@“due_date”]))失败:(“2014-05-01”)不等于(“2014-05-01 00:00:00 +0000”)

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

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

1 个答案:

答案 0 :(得分:3)

我必须指定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;