【发布时间】:2014-11-12 06:04:26
【问题描述】:
我正在使用 RestKit 与我的 JSON 端点通信。端点返回以“毫秒数”为单位的 UNIX 时间戳。但是 RestKit 的默认转换器假定它是“秒数”,我在 NSDate 中得到了错误的值。
于是我环顾四周,发现我需要使用自定义的 valueTransformer 来告诉 RestKit 如何转换我的时间戳。这是我的代码。
+ (RKBlockValueTransformer*) timeIntervalInMillisecondsSince1970TwoWayTransformer {
return [RKBlockValueTransformer valueTransformerWithValidationBlock:^BOOL(__unsafe_unretained Class sourceClass, __unsafe_unretained Class destinationClass) {
// This transformer handles `NSNumber` <-> `NSDate` transformations
NSLog(@"checking new transformer");
return (([sourceClass isSubclassOfClass:[NSNumber class]] && [destinationClass isSubclassOfClass:[NSDate class]]) ||
([sourceClass isSubclassOfClass:[NSDate class]] && [destinationClass isSubclassOfClass:[NSNumber class]]));
} transformationBlock:^BOOL(id inputValue, __autoreleasing id *outputValue, __unsafe_unretained Class outputValueClass, NSError *__autoreleasing *error) {
NSLog(@"transforming");
RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSNumber class], [NSDate class] ]), error);
RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSNumber class], [NSDate class] ]), error);
if ([outputValueClass isSubclassOfClass:[NSDate class]]) {
if ([inputValue isKindOfClass:[NSNumber class]]) {
*outputValue = [NSDate dateWithTimeIntervalSince1970:[inputValue doubleValue] / 1000];
}
} else if ([outputValueClass isSubclassOfClass:[NSNumber class]]) {
*outputValue = @((NSInteger)[inputValue timeIntervalSince1970] * 1000);
}
return YES;
}];
}
然后我将这个转换器添加到 RestKit 的默认转换器中。
RKValueTransformer* transformer = [self timeIntervalInMillisecondsSince1970TwoWayTransformer];
[[RKValueTransformer defaultValueTransformer] addValueTransformer:transformer];
但是,我的转换器永远不会被调用。我在其中写的NSLog 语句永远不会被执行!
然后我尝试了这个——像这样在attributeMapping上写一个转换器:
RKValueTransformer* transformer = [self timeIntervalInMillisecondsSince1970TwoWayTransformer];
RKAttributeMapping *tokenExpiryMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"access_token_expiration" toKeyPath:@"accessTokenExpirationDate"];
tokenExpiryMapping.valueTransformer = transformer;
[userMapping addPropertyMapping:tokenExpiryMapping];
但是当我这样做时代码不会编译。它说“在 'RKAttributeMapping *' 类型的对象上找不到属性 valueTransformer”。我不明白这一点。我在互联网上看到的所有示例,包括带有RestKit's documentation 的示例都说同样的话。所有示例都设置了AttributeMapping 对象的valueTransformer 属性。甚至RestKit Class Reference 说我可以设置它。但是为什么不编译呢?
【问题讨论】:
标签: ios objective-c restkit restkit-0.20 nsvaluetransformer