如果值仅包含数字,AFNetworking 不会返回 NSString
Posted
技术标签:
【中文标题】如果值仅包含数字,AFNetworking 不会返回 NSString【英文标题】:AFNetworking does not returns NSString if the value is contains only digits 【发布时间】:2012-10-10 10:13:34 【问题描述】:我正在尝试使用 AFNetworking 在 json 中接收某个值。该值仅包含数字,我想将其作为 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
【问题讨论】:
我怀疑问题出在您收到的 JSON 或您正在发出的请求上。如果没有这些详细信息,就无法回答您的问题。 【参考方案1】:我认为你必须这样做:
NSString *winCount=[NSString stringWithFormat:@"%d",[[gameResultsDictionary valueForKey:@"win_count"]intValue];
这样,你就可以将数值输入到 winCount NSString 中,然后就可以使用 isEqualToString 方法了
【讨论】:
【参考方案2】:我想你使用 JSON。然后对象的类型由 JSON 编码决定。如果周围有"
,它就是一个字符串。如果它是一个数字并且你想要字符串,请更改数据在服务器上的编码方式。
但是,在这种情况下,使用数字更有意义。您应该通过以下方式更改实现。
NSNumber* winCount = [gameResultsDictionary valueForKey:@"win_count"];
if ([winCount intValue] == 0) //this would actually work for both NSNumber and NSString
NSLog(@"0 wins");
使用字符串比较来比较数字总是暗示你做错了。
【讨论】:
为什么这个答案的点赞数这么少??这是唯一的正确答案。为什么要将两个数字转换为字符串进行比较?【参考方案3】:抛出异常是因为您期望一个对象是NSString
,但实际上是NSNumber
,因此您尝试在NSNumber
上调用isEqualToString:
实现方法。
既然您知道winCount
始终是一个数字,并且显然AFNetworking
使用的JSON 反序列化器将响应中的数字装箱到NSNumber
对象中,您可以轻松地从对象中获取一个字符串,如下所示:
NSString *winCount = [[gameResultsDictionary valueForKey:@"win_count"] stringValue];
现在你有一个数字的字符串表示,你可以为此执行isEqualToString:
另请注意,更优雅的解决方案可能是将您的对象接收为id
s,找到它们的类并根据确定的类进行比较。
【讨论】:
以上是关于如果值仅包含数字,AFNetworking 不会返回 NSString的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 2.0 将 NSURLSessionDataTask 转换为 NSURLSessionDownloadTask 不会将所有文件数据写入磁盘