RestKit不会在64位模拟器中映射BOOL

我需要帮助了解下面的错误。

我有一个BOOL在我的NSObject定义为:

@property (nonatomic) BOOL isOpen; 

在我的课程中,我使用:

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

对于我所有使用iPhone4S和原始iPhone5的testing,已经完美工作了几周。 作为我在64位设备上的模拟器上testing的最后一个testing,我得到以下错误:

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

正如Mikael所说,在64位平台上运行的RestKit存在一些问题,阻止了从NSNumber到BOOL的默认转换(反之亦然)。

但是,有一种方法可以使RestKit Value Transformers模块化架构成为可能。 所以,你只需创build一个专用的变压器类,并用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 = inputValue?@(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]; 

定义映射之前请注意做好注册。

我不得不像sergio的回答那样做一些事情,但在我的情况下,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; } 

这是由我的JSON使用1和0而不是真和假导致的。 出于某种原因,64位设备将select1和0作为NSString,但32位设备作为NSNumber。 而一个设备将会把它变成BOOL,而不是另一个。

如果我在JSON中删除1和0的引号,那么它就起作用了。