我遇到了最奇怪的问题。我正在使用以下代码显示登录用户的个人资料照片(我正在从Drupal数据库中的字段中检索图像)。
的.m
//USER PHOTO
NSDictionary *user = [[DIOSSession sharedSession] user];
NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];
NSLog(@"This is second link %@", secondLink);
if([secondLink length]>0) {
NSString *ImageURL = secondLink;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
// self.imageView.image = [UIImage imageWithData:imageData];
self.imageView.image = [[UIImage alloc] initWithData:imageData];
} else {
NSString *ImageURL = @"http://url.com/default.png";
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
self.imageView.image = [UIImage imageWithData:imageData];
}
当然,如果secondLink为空(或为空,例如没有上传照片),我收到以下错误:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArray0 objectForKeyedSubscript:]:无法识别的选择器发送到实例 0x14f602fe0'
我以为我用if / else语句解决了这个问题,但显然没有。我该如何解决这个问题?
干杯!
答案 0 :(得分:0)
NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];
在阅读用户词典之前,您需要验证用户词典是否有效。
if (user[@"field_photo_path"]) {
// you can look for [@"und"] here
// providing it is a dictionary and not an array
if([user[@"field_photo_path"] isKindOfClass:[NSDictionary class]]){
if (user[@"field_photo_path"][@"und"]) {
// etc
}
}
}
您可以通过将User
类建模为NSObject
子类来减少此嵌套代码,并在该类中包含方法以安全地解析此数据,从而允许您仅在一个位置编写此验证代码。
修改强> 如评论中所述:
如果user[@"field_photo_path"][@"und"]
中的数据是NSDictionary
而不是NSArray
,则无法使用[0]
访问该数据并导致崩溃。您使用索引(NSArray's
,array[0]
等)访问array[1]
,使用密钥NSDictionary
,dict[@"name"]
等访问dict[@"und"]
答案 1 :(得分:0)
解决方案是检查你的密钥
// USER PHOTO
NSDictionary *user = [[DIOSSession sharedSession] user];
if (user[@"field_photo_path"]) {
if ([user[@"field_photo_path"] isKindOfClass:[NSDictionary class]]) {
if (user[@"field_photo_path"][@"und"]) {
if ([user[@"field_photo_path"][@"und"]isKindOfClass:[NSArray class]]) {
if ([user[@"field_photo_path"][@"und"] count]>0) {
if (user[@"field_photo_path"][@"und"][0][@"safe_value"]) {
if ([user[@"field_photo_path"][@"und"][0][@"safe_value"] isKindOfClass:[NSDictionary class]]){
NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];
NSLog(@"This is second link %@", secondLink);
if([secondLink length]>0) {
NSString *ImageURL = secondLink;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
// self.imageView.image = [UIImage imageWithData:imageData];
self.imageView.image = [[UIImage alloc] initWithData:imageData];
} else {
NSString *ImageURL = @"http://url.com/default.png";
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
self.imageView.image = [UIImage imageWithData:imageData];
}
}
}
}
}
}
}
}
您也可以使用try catch块来避免崩溃
@try {
//USER PHOTO
NSDictionary *user = [[DIOSSession sharedSession] user];
NSString *secondLink = user[@"field_photo_path"][@"und"][0][@"safe_value"];
NSLog(@"This is second link %@", secondLink);
if([secondLink length]>0) {
NSString *ImageURL = secondLink;
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
// self.imageView.image = [UIImage imageWithData:imageData];
self.imageView.image = [[UIImage alloc] initWithData:imageData];
} else {
NSString *ImageURL = @"http://url.com/default.png";
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:ImageURL]];
self.imageView.image = [UIImage imageWithData:imageData];
}
}
@catch (NSException *exception) {
//Handle expecption
}
@finally {
}