2014-11-12 2 views
3

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조차도 내가 설정할 수 있다고 말한다. 그런데 왜 컴파일되지 않습니까?

답변

2

그래서 결국 문제가 무엇인지 파악할 수있었습니다.

내 podfile이 RestKit 0.20.3을 사용하도록 구성되었습니다. 그런 다음 을 다른 포드로 추가했습니다. 그러나 RestKit 0.20.3 및 이전 버전은 자체 버전의 RKValueTransformer (.h 및 .m) 파일과 함께 제공됩니다. 그리고 더 오래된 버전의 RestKit은 최신 RKValueTransformers 라이브러리를 사용하지 않기 때문에 자신의 트랜스포머 추가를 지원하지 않습니다.

내가 RestKit 버전을 최신 버전으로 업그레이드했을 때 (실제로는 0.21.0 이상이면 작동 함) 모든 것이 올바르게 작동하기 시작했습니다. Pokel RKValueTransformers를 추가 할 필요가 없습니다. RestKit의 종속성으로 자동 추가되기 때문입니다.

1

addValueTransformer: 대신 insertValueTransformer:atIndex:을 사용하여 끝 부분이 아닌 목록의 처음에 추가 할 수 있습니다.

+0

시도해 보았습니다. 일하지 않았어. –

+0

32 비트 오버플로를 처리하기 위해 NS NSnumber에 변압기 NSString을 추가하려고했습니다. 이 변경 작업을 수행하기 전까지는 변압기가 호출되지 않았습니다. – KIDdAe

0

신속하게 값 변환기를 성공적으로 만들 수있었습니다. 의 목적은 단지 내 모델에 타임 스탬프 downloadedOn을 추가하는 것입니다, 그래서 전혀 inputValue을 사용하지 마십시오

let downloadedMapping = RKAttributeMapping(fromKeyPath: "@self", toKeyPath: "downloadedOn") 
downloadedMapping.valueTransformer = RKBlockValueTransformer(validationBlock: nil){ _, outputValue, _, error -> Bool in 
     outputValue.memory = NSDate() 
     return true 

} 
myMapping.addPropertyMapping(downloadedMapping) 

나에게 가장 큰주의해야 할 점은 내가 outputValue 포인터 값을 때까지 쓰기 방법이었다 I inout 매개 변수를 사용할 필요없이 outputValue 매개 변수의 memory 속성에 액세스해야한다는 것을 알았습니다.

: 나는 downloadedOn 속성이 다양한 클래스에 대한이 매핑을 사용할 수 있도록 내가, 내 재산 매핑의 다른 측면에 대한 @self의 일반적인 키 패스를 사용하고 있습니다.

관련 문제