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;
我想在创建 特定请求 时 运行 在 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;