Я использую 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];
Но код не компилируется, когда я это делаю. Пишет: «Свойство valueTransformer не найдено в объекте типа RKAttributeMapping *». Я этого не понимаю. Все примеры, которые я видел в Интернете, в том числе с документацией RestKit, говорят: тоже самое. Во всех примерах устанавливается свойство valueTransformer
объекта AttributeMapping
. Даже Справочник по классам RestKit говорит, что я могу его установить. Но тогда почему не компилируется?