2014-03-04 24 views
4

我需要幫助瞭解下面的錯誤。RestKit不會在64位模擬器中映射BOOL

我定義爲我的NSObject的一個BOOL:

@property (nonatomic) BOOL isOpen; 

在我RESKIT類別I:

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

得很完美了幾個星期的使用我的iPhone4S和原始了所有的考試iphone 5。作爲最後的測試,我測試了64位設備的模擬器,並且我收到以下錯誤:

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

的iPhone 5S,iPad的空氣和視網膜iPad的迷你是唯一64目前的iOS設備。 – Gavin

+0

所以想必我的應用程序不能正常使用它們?使用restKit正確創建BOOL映射的方法是什麼? – Mika

+0

嘗試使用'NSNumber'而不是'BOOL',會發生什麼? – Wain

回答

3

正如Mikael所說,在64位平臺上運行的RestKit存在一些故障,阻止了從NSNumber到BOOL(和反之亦然)的默認轉換。

雖然有一種方法可以使這項工作得益於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

這是由於使用1和0,而不是真假我的JSON。出於某些原因,64位設備將以1和0作爲NSString,但將32位設備作爲NSNumber。一臺設備會將其轉換爲BOOL,而不是其他設備。

如果我在JSON中將引號1和0放在一起,那麼它就可以工作。

2

我不得不這樣做沿着相同的路線是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; 
} 
+0

這很奇怪,因爲''private':0'對我來說就是''private':「0」'不是。在變壓器部分的github上有一個公開的問題......你也應該在那裏發表評論,因爲他們很難找到問題! – Mika

+0

@Mikael確實,這很奇怪,特別是考慮到類是'__NSCFBoolean'和'__NSCFNumber'。我評論了公開的問題,所以布萊克可以看看。 – iwasrobbed

+0

我有這個確切的問題,我發佈一個包含bools的對象。在32位設備上,bools映射爲0和1.在64位設備上,它們映射爲true和false。我正試圖實施您的解決方案,但我無法實現它的工作。RestKit調用validateTransformationFromClass:toClass:方法,但從未調用transformValue:toValue:ofClass:error:方法。我在全球註冊了變壓器。有什麼我失蹤? – rplankenhorn