RestKit을 사용하여 JSON 끝점과 통신하고 있습니다. 엔드 포인트는 UNIX 시간 소인을 '밀리 초 수'로 리턴합니다. 하지만 RestKit의 기본 변압기는 '초'라고 가정하고 NSDate에서 잘못된 값을 얻습니다.RestKit valueTransformer가 호출되지 않습니다.
그래서 둘러 보았고 RestKit에 내 타임 스탬프를 변환하는 방법을 알려주기 위해 맞춤형 ValueTransformer를 사용해야한다는 것을 알았습니다. 내가 가진 코드는 다음과 같습니다.
+ (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
성명은 절대로 실행되지 않습니다!
RKValueTransformer* transformer = [self timeIntervalInMillisecondsSince1970TwoWayTransformer];
RKAttributeMapping *tokenExpiryMapping = [RKAttributeMapping attributeMappingFromKeyPath:@"access_token_expiration" toKeyPath:@"accessTokenExpirationDate"];
tokenExpiryMapping.valueTransformer = transformer;
[userMapping addPropertyMapping:tokenExpiryMapping];
을하지만 이렇게하면 코드는 컴파일되지 않습니다 :이 같은 attributeMapping에 변압기를 쓰기 -
그래서 나는이 시도. 그것은 "속성 valueTransformer가 'RKAttributeMapping *'유형의 객체에서 발견되지 않습니다. 나는 이것을 이해하지 못한다. RestKit's documentation와 같은 것을 포함하여 내가 인터넷에서 본 모든 예는 똑같은 말을합니다. 모든 예제는
AttributeMapping
개체의
valueTransformer
속성을 설정합니다.
RestKit Class Reference조차도 내가 설정할 수 있다고 말한다. 그런데 왜 컴파일되지 않습니까?
시도해 보았습니다. 일하지 않았어. –
32 비트 오버플로를 처리하기 위해 NS NSnumber에 변압기 NSString을 추가하려고했습니다. 이 변경 작업을 수행하기 전까지는 변압기가 호출되지 않았습니다. – KIDdAe