从api中获取图像并在UIImageView swift中显示它们

时间:2015-11-16 22:58:30

标签: ios xcode swift uiimageview

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

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

  

致命错误:在解包可选值时意外发现nil

请查看我的实施情况,并告诉我是否可以更改任何内容。

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 个答案:

答案 0 :(得分:1)

当你的值为nil时,你肯定试图访问一个可选项,你需要首先建立一个可选的绑定来检查你尝试访问的可能值是不是{{1} }。

根据nil NSURL的构造函数Apple

  

返回使用init(string:)初始化的NSURL对象。如果网址字符串格式错误,请返回URLString

那么你需要首先做以下事情:

nil

然后下一个可选项是根据Apple if let url = NSURL(string: self.restaurants[indexPath.row].restaurantImage) { } 类的UIImage类的构造函数:

  

返回使用NSURL初始化的URLString对象。如果URL字符串格式错误,则返回nil。那么你需要改为使用以下代码:

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

最后,对于NSData类的可以返回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

我希望这对你有所帮助。