我想在创建特定请求时在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没有使用我的值变换器?
答案 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;