我正在尝试从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
}
}
})
答案 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
。
我希望这对你有所帮助。