如果在 JSON 对象中加载空图像 URL,则应用程序崩溃

Posted

技术标签:

【中文标题】如果在 JSON 对象中加载空图像 URL,则应用程序崩溃【英文标题】:App crashes if null image URL is loaded in JSON object 【发布时间】:2014-02-24 04:19:42 【问题描述】:

我正在通过 JSON 使用 mysql 表中的对象填充 tableView。 很多用户在网站表单中引入源数据,有时他们不会在字段中引入图像 URL。

下载的 JSON 对象显示在 tableView 中,其中行被配置为显示文本、详细文本和图像。

如果对象没有图片 URL,应用程序崩溃,我想显示默认图片,以避免崩溃。

这就是我为对象图像加载 JSON 数据的方式:

    NSMutableString *logo = [[NSMutableString alloc]initWithString:@"http://mujercanariasigloxxi.appgestion.eu/logos/"];
    NSString *imageURL = [[categorias objectAtIndex:indexPath.row] objectForKey:@"strImagen"];
    [logo appendString:imageURL];
    NSURL *logoURL = [NSURL URLWithString:logo];
    NSData *logoData = [NSData dataWithContentsOfURL:logoURL];


    cell.imageView.image = [UIImage imageWithData:logoData];

如果网站用户未在 Web 表单中包含图像 URL,那么避免崩溃和显示默认图像的最佳方法应该是什么?

【问题讨论】:

你需要检查 imageURL,如果它是 nil 或空然后加载你的默认图像。 检查图像,如果它为 nil,则从服务器加载默认图像,否则加载您的图像。 你也可以在那里设置占位符图片。 @Manthan,占位符图片是什么意思? 您可以将这个github.com/rs/SDWebImage 用于来自服务器的图像。如果图像不是从服务器加载的,您可以显示占位符图像。 【参考方案1】:

尝试使用if-else 条件,例如

NSMutableString *logo = [[NSMutableString alloc]initWithString:@"http://mujercanariasigloxxi.appgestion.eu/logos/"];

NSData *logoData;
if([categorias objectAtIndex:indexPath.row] && [[categorias objectAtIndex:indexPath.row] objectForKey:@"strImagen"])
   NSString *imageURL = [[categorias objectAtIndex:indexPath.row] objectForKey:@"strImagen"];
   [logo appendString:imageURL];
   NSURL *logoURL = [NSURL URLWithString:logo];
  logoData = [NSData dataWithContentsOfURL:logoURL];

else 
   //load your default image here
   logoData = //default logo data



cell.imageView.image = [UIImage imageWithData:logoData];

【讨论】:

【参考方案2】:
//set an activity indicator                 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
dispatch_async(queue, ^
    NSString *imageURL = [[categorias objectAtIndex:indexPath.row] objectForKey:@"strImagen"];
    if (imageURL.count>0)
        [logo appendString:imageURL];

        //declare logodata as nsdata
        logoData=[NSData dataWithContentsOfURL:[NSURL URLWithString:logo]];
    

    dispatch_sync(dispatch_get_main_queue(), ^

        //turn the activity indicator off
        if(logoData!=nil)
            cell.imageView.image = [UIImage imageWithData:logoData];
        else
            //set your default image.
            );
);

希望这对你有帮助。

【讨论】:

【参考方案3】:

您可以尝试检查 imageurl 是否为nil,或者在某些情况下它会为null

NSMutableString *logo = [[NSMutableString alloc]initWithString:@"http://mujercanariasigloxxi.appgestion.eu/logos/"];
NSString *imageURL = [[categorias objectAtIndex:indexPath.row] objectForKey:@"strImagen"];


if(imageURL != nil && ![imageURL isEqual:[NSNull null]])

    [logo appendString:imageURL];
    NSURL *logoURL = [NSURL URLWithString:logo];
    NSData *logoData = [NSData dataWithContentsOfURL:logoURL];
    cell.imageView.image = [UIImage imageWithData:logoData];

else
    cell.imageView.image = [UIImage imageNamed:@"Default_image"];

【讨论】:

以上是关于如果在 JSON 对象中加载空图像 URL,则应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ionic 2 或 3 应用程序中加载实际图像之前显示占位符图像

图像未在 <img> 标记中加载 ftp url

Flutter:如何优先显示来自 Asset 的图像,如果找不到,则显示来自 URL 的图像?

URLImage 从不在 SwiftUI 的小部件应用程序中加载图像 [重复]

无法使用设备图像 URL 在设备中加载图像?

在 tableView 中加载 iPhone 磁盘图像(像照片应用程序)