gpt4 book ai didi

ios - 崩溃: While updating UIImageView using SDWebImage

转载 作者:行者123 更新时间:2023-11-30 11:54:19 26 4
gpt4 key购买 nike

我想要实现的是,当用户单击任何 CollectionViewCell 时,将显示一个用于缩放滚动的新 View 。基本上我有两个不同的类,名为 MyCollectionViewController 和 MyScrollViewController。我的 Collection View Controller 中有以下代码部分:

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)!)
}

我的 ScrollView Controller 中有以下代码部分:

import UIKit
import SDWebImage
class MyScrollViewController: UIViewController, UIScrollViewDelegate {
@IBOutlet weak var myImageView: UIImageView!
@IBOutlet weak var myScrollView: UIScrollView!
override func viewDidLoad(){
super.viewDidLoad()
self.myScrollView.minimumZoomScale = 1.0
self.myScrollView.maximumZoomScale = 6.0
}
public func setImageToScrollView(image_URL: String){
DispatchQueue.main.async {
self.myImageView!.sd_setImage(with: URL(string: image_URL), completed: {
(image, error, cacheType, url) in
//Completion Block ... Do Nothing
})
}
}
override func didReceiveMemoryWarning(){
super.didReceiveMemoryWarning()
}
func viewForZooming(in scrollView: UIScrollView) -> UIView?{
return self.myImageView
}
}

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

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

fatal error :解包可选值时意外发现 nil

查询:

  1. 首先我调用了pushViewController,然后调用了我的自定义函数。这是从 Collection View 单元格调用函数的正确方法吗?
  2. 为什么它显示在解包可选值时意外发现 nil.. 尽管我得到了无错误的图像 url。

最佳答案

回到你的问题:

Firstly I called pushViewController and then I called my custom defined function. Is it proper way to call functions from collection view cell?

这个问题的答案是,在 viewDidLoad 之前,您不应该调用引用导出的函数。导出是隐式展开的选项,但在 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)
}

这将改变您的调用时间——确保调用该函数时 socket 实际存在。

===剩下的是我之前的回答(仍然相关,但没有解决你的问题)===

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

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

这应该会让你的问题消失。 SetImage 执行自己的调度,并且仅在 socket 仍然存在时更新 UI。

其他评论者指出了为什么你的代码有时会崩溃(当你的异步 block 完成时 self.myImageView 可能为零)以及如何防止(如果让绑定(bind)或防护检查 UIImageView 导出是否仍然存在)。这些都是一般相关的技术——但 SetImage 会为您处理所有这些事情。

关于ios - 崩溃: While updating UIImageView using SDWebImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47993234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com