如何从api获取图像

时间:2019-02-13 10:26:45

标签: ios swift4

我正在尝试从后端人员提供的api中获取图像并下载图像,我正在通过pods使用“ SDWebImage”。我的要求是:我将拥有以下产品的集合:该收集数据我具有图像url。我必须从该图像url获取该产品图像,并且我需要在单独的产品详细信息中显示该图像Viewcontroller,但是我遇到了类似“线程1:致命错误”的运行时错误:意外地发现了nil,同时展开了Optional值”。我在下面提供了我的代码

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
var imag: String = dict["photo"] as! String
lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag), placeholderImage: UIImage(named: "Avatar-male.png"))
}

3 个答案:

答案 0 :(得分:1)

这将有助于查看崩溃行,但是在您发布的代码中已经显示出了可能,其中您从JSON中强制解包了字符串值:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    var imag: String = dict["photo"] as! String
    lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag), placeholderImage: UIImage(named: "Avatar-male.png"))
}

使用!进行强制展开。

这应该类似于:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
    guard let imageURL: String = dict["photo"] as? String else { return }
    lmpviewcontroller.userimgobj.sd_setImage(with: URL(string: imageURL), placeholderImage: UIImage(named: "Avatar-male.png"))
}

通过强制展开,这意味着您100%确保该值将始终存在。如果没有id,则您的应用程序将崩溃。

通过可选地检查它,您需要使用if letguard let检查它的存在。一般来说,这类似于:

let myOptionalValue: Any?
if myOptionalValue == nil {
    return
} else {
    doSomethingWithMyValue(myOptionalValue!)
}

,但是Swift的语法更好,如先前所示。

答案 1 :(得分:0)

我建议使用Kingfisher

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
      if let  imag = dict["photo"]{
      let url = URL(string: imag)
      userimgobj.kf.setImage(with: url)
      }
}

答案 2 :(得分:0)

//带有sd图像

  func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
            if dict["photo"] != nil{
                    lmpviewcontroller.userimgobj.sd_setImage(with: URL(string:imag)), completed: nil)
                    }else{
                        lmpviewcontroller.userimgobj = UIImage(named: "placeholder")
                    }
    }