2012-10-10 62 views
0

我試圖使用AFNetworking在json中接收某個值。該值只包含數字,我想將其作爲NSString接收。當我比較接收到的值時,我得到一個異常(例外情況也在本文後面提到)AFNetworking不會返回NSString,如果該值只包含數字

這裏是產生錯誤的編碼。

NSArray *overallGameResultsArray = [resultDictionary valueForKey:@"overall_game_results"]; 
     winCountDictionary = [[NSDictionary alloc] init]; 
     for (NSDictionary *gameResultsDictionary in overallGameResultsArray) 
     { 
      NSString *userId = [gameResultsDictionary valueForKey:@"winner_user_id"]; 
      NSString *winCount = [gameResultsDictionary valueForKey:@"win_count"]; 

      if ([winCount isEqualToString:@"0"]) 
      { 
       NSLog(@"0 wins"); 
      } 

     } 

如果「如果比較」被評論,我不會得到異常。 win_count只包含jSON響應中的數字。

以下是我遇到的異常錯誤。

2012-10-10 15:41:35.086 FMB[3549:c07] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0 2012-10-10 15:41:35.086 FMB[3549:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7230af0' 
*** First throw call stack: (0x1638012 0x1345e7e 0x16c34bd 0x1627bbc 0x162794e 0x11e03 0x20583 0x1fab4 0x245053f 0x2462014 0x24527d5 0x15deaf5 0x15ddf44 0x15dde1b 0x26997e3 0x2699668 0x28d65c 0x2512 0x2445) libc++abi.dylib: terminate called throwing an exception 
+0

我懷疑問題在於您收到的JSON或您提出的請求。沒有這些更多的細節,不可能回答你的問題。 –

回答

2

我認爲你必須要做到:

NSString *winCount=[NSString stringWithFormat:@"%d",[[gameResultsDictionary valueForKey:@"win_count"]intValue]; 

有了這個,你得到的數值爲winCount的NSString,然後就可以則應使用isEqualToString方法

+0

謝謝。這解決了這個問題。 –

+0

幾乎沒有完美的解決方案... – Sulthan

1

唯一的例外是拋出,因爲你期望對象是NSString但實際上是NSNumber,所以你嘗試isEqualToString:NSNumber這不會實現方法d。

既然你知道winCount始終是一個數字,顯然JSON解串器是AFNetworking使用Box在響應中的數字爲NSNumber對象,你可以很容易地搶串出這樣的對象:

NSString *winCount = [[gameResultsDictionary valueForKey:@"win_count"] stringValue]; 

現在你有你的電話號碼的字符串表示,你可以爲此進行isEqualToString:

還要注意的是一個更優雅的解決方案可能是收到您的對象作爲id S,找到自己的班級,做的比較淺由班級確定。

1

我想你使用JSON。然後,對象的類型由JSON編碼確定。如果周圍有",則爲字符串。如果它是一個數字並且您想要字符串,請更改數據在服務器上的編碼方式。

但是,在這種情況下,使用數字更有意義。您應該按照以下方式更改實施。

NSNumber* winCount = [gameResultsDictionary valueForKey:@"win_count"]; 

if ([winCount intValue] == 0) { //this would actually work for both NSNumber and NSString 
    NSLog(@"0 wins"); 
}

比較使用字符串比較的數字總是暗示您做錯了什麼。

+1

爲什麼這個答案有這麼幾個upvotes?這是*唯一*正確的答案。爲什麼你會把兩個數字轉換成一個字符串來比較它們? –

相關問題