AFNetworking [NSNull 长度]
Posted
技术标签:
【中文标题】AFNetworking [NSNull 长度]【英文标题】:AFNetworking [NSNull length] 【发布时间】:2014-04-04 15:29:50 【问题描述】:我的应用程序因以下错误而崩溃:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x1cb8068'
我有很多数据需要在我的表格中显示。
在这个例子中,我在我的 JSON 中使用键、品牌。
如果我 NSLog 品牌,我会得到这样的结果:
品牌A
品牌B
品牌C
空
品牌E
空
空
品牌Z
当我滚动浏览我的表格并点击应用程序崩溃时。
如何将 替换为字符串?
这是我的方法:
- (void)updateData
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager GET:@"http://mydataurl.com/abc" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject)
NSArray * aArray = [responseObject valueForKeyPath:@"result_payload.items"];
self.inventoryArray = [NSArray arrayWithArray:aArray];
// ***** Brand ******
self.brandArray = [self.inventoryArray valueForKeyPath:@"brand"];
for (int a = 0; a < [self.brandArray count]; a++)
self.brandString = [self.brandArray objectAtIndex:a];
[self.tableView reloadData];
failure:^(AFHTTPRequestOperation *operation, NSError *error)
NSLog(@"Error: %@", error);
];
我为 NSDictionary 添加了一个类别:
.h
#import <Foundation/Foundation.h>
@interface NSDictionary (Utility)
- (NSString*)stringForKey:(id)key;
@end
.m
#import "NSDictionary+Utility.h"
@implementation NSDictionary (Utility)
- (NSString*)stringForKey:(id)key
NSString * string = [self objectForKey:key];
if ([string isEqual:[NSNull null]])
return nil;
return string;
@end
我用的分类不多,需要在特定的地方调用这个方法吗?或者只是将#import 添加到我的主类中?
【问题讨论】:
【参考方案1】:您确定 JSON 没有返回具有“null”值的元素吗?
【讨论】:
【参考方案2】:如果您查看服务器提供给您的实际 JSON 文档,您会发现它包含“null”值。当数据中存在“null”值时,JSON 解析器将生成值 [NSNull null] 来表示 null。
您必须检查该值。如果你认为你有一个 NSString、一个 NSNumber、一个 NSArray 或一个 NSDictionary,但你真正拥有的是一个 [NSNull null],然后你给它发送一条消息,你就会崩溃。
处理此问题的最简单方法:使用类似方法向 NSDictionary 添加类别
(NSString*)stringForKey; (NSNumber*)numberForKey;调用objectForKey,检查对象的类型,如果类型错误则返回nil。
举个例子:
@interface NSDictionary (JSONExtensions)
- (NSString*)stringForKey:(NSString*)key;
@end
@implementation NSDictionary (JSONExtensions)
- (NSString*)stringForKey:(NSString *)key
id result = [self objectForKey:key];
if ([result isKindOfClass:[NSNumber class]])
result = [((NSNumber *) result) stringValue];
else if (! [result isKindOfClass:[NSString class]])
result = nil;
return result;
@end
如果键不存在,或者值是 [NSNull null],或者值是数组或字典,这将返回 nil。它将一个数字转换为一个字符串并返回一个字符串,因此您可以保证得到 nil 或 NSString*。 (一些服务器倾向于发送仅由数字组成的字符串作为数字而不是字符串)。所以如果你想要一个字符串作为键“MyString”,你写
NSString* myString = [myDict stringForKey:@"MyString"];
并且您可以确定结果是 nil 或字符串。
【讨论】:
我确实创建了一个类别。在哪里称呼它合适?【参考方案3】:我用
- (id)objectForKeyNotNull:(id)key
id object = [self objectForKey:key];
if (object == [NSNull null])
return nil;
return object;
将 NSNull 值转换为 nil。我将它作为一个类别添加到 NSDictionary 中。
【讨论】:
以上是关于AFNetworking [NSNull 长度]的主要内容,如果未能解决你的问题,请参考以下文章
iOS 8 工作但 iOS 7 崩溃 -[NSNull 长度]: unrecognized selector sent to instance