2014-03-04 4 views
4

아래 오류를 이해하는 데 도움이 필요합니다. 내가 사용하는 내 RESKIT 클래스에서RestKit은 64 비트 시뮬레이터에서 BOOL을 매핑하지 않습니다.

@property (nonatomic) BOOL isOpen; 

:

[mapping addAttributeMappingsFromDictionary:@{...... 
              @"isOpen":  @"isOpen" 
              ......}]; 

내 모든 테스트를 내 아이폰 4S와 원본을 사용하는 주 동안 완벽하게 작동했습니다

나는 정의 내 NSObject의에서 BOOL이 아이폰 5. 마지막 테스트로 나는 64 비트 장치 시뮬레이터에서 테스트 나는 다음과 같은 오류 얻을 : true와 false 대신 1과 0을 사용하여 내 JSON으로

restkit.object_mapping:RKMappingOperation.m:440 Failed transformation of value at keyPath 'isOpen' to representation of type '__NSCFBoolean': Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 "Failed transformation of value '1' to __NSCFBoolean: none of the 2 value transformers consulted were successful." UserInfo=0x10cba1c00 {NSLocalizedDescription=Failed transformation of value '1' to __NSCFBoolean: none of the 2 value transformers consulted were successful., detailedErrors=(
"Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3002 \"The given value is not already an instance of '__NSCFBoolean'\" UserInfo=0x10cb86d30 {NSLocalizedDescription=The given value is not already an instance of '__NSCFBoolean'}", 
"Error Domain=org.restkit.RKValueTransformers.ErrorDomain Code=3000 \"Expected an `inputValue` of type `NSNull`, but got a `__NSCFNumber`.\" UserInfo=0x10cbeb400 {NSLocalizedDescription=Expected an `inputValue` of type `NSNull`, but got a `__NSCFNumber`.}" 
)} 
+0

아이폰 5S, 아이 패드 에어와 레티 나 아이 패드 미니는 64입니다 지금까지 iOS 기기에 맞춰 보았습니다. – Gavin

+0

아마도 내 앱이 제대로 작동하지 않겠습니까? restkit으로 BOOL 맵을 올바르게 만드는 방법은 무엇입니까? – Mika

+0

'BOOL' 대신'NSNumber'를 사용해보십시오. 어떻게됩니까? – Wain

답변

3

Mikael은 64 비트 플랫폼에서 실행되는 RestKit에 약간의 결함이있어 NSNumber에서 BOOL (및 viceversa)으로의 기본 변환을 방지합니다.

RestKit Value Transformers 모듈러 아키텍처 덕분에이 작업을 수행 할 수있는 방법이 있습니다. 그래서, 전용 변압기 클래스를 만들고 RestKit 기본 변압기에 등록하십시오. 당신은 이런 식으로 등록

@interface RKCustomBOOLTransformer : NSObject <RKValueTransforming> 

+ (instancetype)defaultTransformer; 

@end 

@implementation RKCustomBOOLTransformer 

+ (instancetype)defaultTransformer { 
    return [RKCustomBOOLTransformer new]; 
} 

- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass { 
    return ([inputValueClass isSubclassOfClass:[NSNumber class]] && 
     [outputValueClass isSubclassOfClass:[NSNumber class]]); 
} 

- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error { 
    RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ [NSNumber class] ]), error); 
    RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ [NSNumber class] ]), error); 

    if (strcmp([inputValue objCType], @encode(BOOL)) == 0) { 
     *outputValue = [email protected](1):@(0); 
    } else if (strcmp([inputValue objCType], @encode(int)) == 0) { 
     *outputValue = ([inputValue intValue] == 0) ? @(NO) : @(YES); 
    } 
    return YES; 
} 

@end 

:

이 변압기의 모습 수있는 방법입니다

[[RKValueTransformer defaultValueTransformer] 
insertValueTransformer:[RKCustomBOOLTransformer defaultTransformer] atIndex:0]; 

당신의 매핑을 정의 전에 등록 일을주의하십시오.

1

이가 발생했습니다. 어떤 이유로 64 비트 장치는 1과 0을 NSString으로 가져 오지만 32 비트 장치는 NSNumber로 선택합니다. 그리고 한 장치는 그것을 BOOL로 변경하고 다른 장치는 BOOL으로 변경하지 않습니다.

JSON에서 1과 0 주변의 인용 부호를 삭제하면 작동합니다.

2

나는 세르지오의 대답과 같은 라인을 따라 뭔가를해야했다,하지만 내 경우에는 JSON은 유사한 형성 : "private":0 :

@implementation RPBooleanTransformer 

+ (instancetype)defaultTransformer { 
    return [[RPBooleanTransformer alloc] init]; 
} 

- (BOOL)validateTransformationFromClass:(Class)inputValueClass toClass:(Class)outputValueClass { 
    return ([inputValueClass isSubclassOfClass:NSClassFromString(@"__NSCFNumber")] && 
      [outputValueClass isSubclassOfClass:NSClassFromString(@"__NSCFBoolean")]); 
} 

- (BOOL)transformValue:(id)inputValue toValue:(id *)outputValue ofClass:(Class)outputValueClass error:(NSError **)error { 
    RKValueTransformerTestInputValueIsKindOfClass(inputValue, (@[ NSClassFromString(@"__NSCFNumber") ]), error); 
    RKValueTransformerTestOutputValueClassIsSubclassOfClass(outputValueClass, (@[ NSClassFromString(@"__NSCFBoolean") ]), error); 

    if ([inputValue isKindOfClass:NSClassFromString(@"__NSCFNumber")]) { 
    *outputValue = ([inputValue boolValue] == YES) ? @(YES) : @(NO); 
    } else if ([inputValue isKindOfClass:NSClassFromString(@"__NSCFBoolean")]) { 
    *outputValue = [inputValue isEqual:@(YES)] ? @1 : @0; 
    } 
    return YES; 
} 
+0

''private ": 0'은 나에게"private ":"0 "'이 없기 때문에 이것은 이상합니다. 변압기 섹션에 github에 대한 미해결 문제가 있습니다 ... 문제를 찾기가 어려워서 거기에 의견을 제시해야합니다! – Mika

+0

@Mikael 실제로, 클래스가'__NSCFBoolean'과'__NSCFNumber'라는 점을 감안할 때 매우 이상했습니다. 블레이크 (Blake)가 공개 할 수 있도록 공개 문제에 대해 의견을 말했습니다. – iwasrobbed

+0

bool을 포함하는 객체를 게시 할 때 정확한 문제가 있습니다. 32 비트 장치에서 bool은 0과 1로 매핑됩니다. 64 비트 장치에서는 true와 false로 매핑됩니다. 귀하의 솔루션을 구현하려고하지만 그것을 작동시킬 수 없습니다.RestKit은 validateTransformationFromClass : toClass : 메서드를 호출하지만 transformValue : toValue : ofClass : error : 메서드를 호출하지 않습니다. 전 세계에 변압기를 등록했습니다. 제가 누락 된 것이 있습니까? – rplankenhorn

관련 문제