RestKit no asigna BOOL en el simulador de 64 bits

Necesito ayuda para comprender el error a continuación.

Tengo un BOOL en mi NSObject definido como:

@property (nonatomic) BOOL isOpen; 

En mi class de reskit utilizo:

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

Ha funcionado perfectamente durante semanas para todas mis testings con mi iPhone4S y un iPhone5 original. Como última testing que probé en el simulador en un dispositivo de 64 bits y obtuve el siguiente error:

  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`.}" )} 

Como dice Mikael, hay un problema técnico en RestKit que se ejecuta en una plataforma de 64 bits que evita la conversión pnetworkingeterminada de NSNumber a BOOL (y viceversa).

Sin embargo, existe una forma de hacer que esto funcione gracias a la architecture modular de RestKit Value Transformers. Por lo tanto, solo crea una class de transformador dedicada y la registra con el transformador pnetworkingeterminado de RestKit.

Así es como podría verse el transformador:

 @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 = inputValue?@(1):@(0); } else if (strcmp([inputValue objCType], @encode(int)) == 0) { *outputValue = ([inputValue intValue] == 0) ? @(NO) : @(YES); } return YES; } @end 

Lo registras así:

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

Tenga cuidado de hacer el logging antes de definir sus mapeos.

Tuve que hacer algo en la misma línea que la respuesta de Sergio, pero en mi caso el JSON se formó de manera similar a: "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; } 

Esto fue causado por mi JSON usando 1 y 0 en lugar de verdadero y falso. Por algún motivo, los dispositivos de 64 bits capturarán 1 y 0 como NSString pero el dispositivo de 32 bits como NSNumber. Y un dispositivo cambiará eso en un BOOL y no en el otro.

Si suelto las comillas alnetworkingedor del 1 y el 0 en el JSON, entonces funciona.