崩溃:使用SDWebImage更新UIImageView

时间:2017-12-27 13:41:32

标签: ios swift uiimageview sdwebimage

我想要实现的是,当用户点击任何CollectionViewCell时,将显示缩放滚动的新视图。基本上我有两个不同的类,名为MyCollectionViewController和MyScrollViewController。我的集合视图控制器中有以下代码部分:

 curl -I --silent ftp://username:passwd@192.168.1.63/filenotexist.txt >/dev/null

我在滚动视图控制器中有以下代码部分:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController
    self.navigationController?.pushViewController(VC!, animated: true)
    VC?.setImageToScrollView(image_URL: (self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)!)
}

我正在使用 SDWebImage ...一个开源库来管理图片缓存。

问题:有时成功加载图片时没有任何错误,但大多数时候我的应用崩溃,同时执行 sd_setImage api SDWebImage 框架有以下错误...... enter image description here

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

QUERY

  1. 首先我调用了pushViewController,然后调用了自定义函数。是从集合视图单元调用函数的正确方法吗?
  2. 为什么在展开Optional值时显示意外发现的nil虽然我得到了无错误的图片网址。

1 个答案:

答案 0 :(得分:0)

回到你的问题:

  

首先我调用了pushViewController,然后调用了自定义函数。是从集合视图单元调用函数的正确方法吗?

答案是你不应该在viewDidLoad之前调用引用outlet的函数。这些网点是隐式解包的选项,但在viewDidLoad之前不保证存在。所以,你有一个竞争条件。有时它有效。

更改它以便您传入URL但不要调用该函数:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath){
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    let VC = storyboard.instantiateViewController(withIdentifier: "myScrollVC") as? MyScrollViewController
    self.navigationController?.pushViewController(VC!, animated: true)
    VC.imgURL =  self.jsonData?.HD_WALLPAPER![indexPath.row].wallpaper_image)!
}

其中imgURL是MyScrollViewContainer上的实例变量。然后从viewDidLoad调用你的函数,传入imgURL。

override func viewDidLoad(){
    super.viewDidLoad()
    self.myScrollView.minimumZoomScale = 1.0
    self.myScrollView.maximumZoomScale = 6.0
    setImageToScrollView(image_URL: imgURL)
}

这将改变您的通话时间 - 确保在调用该功能时插座实际存在。

===其余的是我之前的答案(仍然相关,但没有解决你的问题)===

您不需要在Dispatch.async中包装SetImage调用。你的功能应该是一行:

public func setImageToScrollView(image_URL: String){
   self.myImageView.sd_setImage(with: URL(string: image_URL))
}

那会让你的问题消失。 SetImage自己进行调度,只有在插座仍然存在时才更新UI。

其他评论者指出为什么你的代码有时崩溃(当异步块完成时self.myImageView可能是nil)以及如何防止(如果让绑定或保护检查UIImageView插座仍然存在)。这些都是相关的技术 - 但SetImage会为您处理所有这些。