2015-11-16 63 views
1

我试图从API获取图像,并使用Swift在UITableView中显示它们。从api获取图像并在UIImageView中显示它们swift

我设法准确地获取所有属性,但如果没有特定对象(即餐厅)的图像,我可能不会进行错误处理。这是因为表视图开始填充细一些图像,然后弹了,出现以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

请看看我的实现,让我知道,如果我可以改变任何东西。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

    if let image = UIImage(data: NSData(contentsOfURL: NSURL(string: self.restaurants[indexPath.row].restaurantImage)!)!) { 

     dispatch_async(dispatch_get_main_queue()) {() -> Void in 
       cell.restaurantImage.image = image 
     } 
    } 
}) 

回答

1

当然您要访问的可选当其值nil,你需要做的第一可选绑定来检查,如果你想访问的可能值不nil

根据AppleNSURLinit(string:)构造:

Returns an NSURL object initialized with URLString . If the URL string was malformed, returns nil .

,那么你需要做的排在首位以下几点:

if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 

} 

然后下一个可选择是UIImage的构造器根据Apple的等级:

Returns an NSURL object initialized with URLString . If the URL string was malformed, returns nil . So then you need to do the following code instead:

if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 
    if let image = UIImage(data: NSData(contentsOfURL: url)) { 
    } 
} 

最后,你应该为NSData类的failable构造函数可以返回nil过了,您的最终代码相同的应该是这样的:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

    if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { 
     if let data = NSData(contentsOfURL: url) { 
      if let image = UIImage(data: data) { 
       dispatch_async(dispatch_get_main_queue()) {() -> Void in 
        cell.restaurantImage.image = image 
       } 
      } 
     } 
    } 
}) 

你总是反复使用!操作一个可选的你对编译器说你知道它的值不是nil,最好使用可选链来确保它不是nil

我希望这对你有所帮助。

+0

梦幻般的胜利者。可选的链接做到了这一点。谢谢。 –

+0

@ user2610863很高兴为您效劳 –

相关问题