所以我在尝试让 AlamofireImages ImageDownloader 工作时遇到了一些麻烦。下面是我试图用来下载和稍后缓存图像的功能。
我以前使用普通的 Alamofire 来请求图像,但是,该项目已经发展到包括将图像缓存到磁盘以减少对服务器的请求量。
var downloader: ImageDownloader?
func downloadAndCacheImage(_ url: String, imageView: UIImageView)
{
self.downloader = ImageDownloader()
var urlRequest = try! URLRequest(url: "GiveMeAResponse.com", method: .get)
self.downloader?.download(urlRequest) { response in
switch response.result{
case .success(let image):
print("\(image) has been downloaded")
break
case .failure(let error):
print("ERROR: \(response.error)")
break
}
if let imageData = response.data{
debugPrint("Applying image...")
if let image = UIImage(data: imageData){
ImageManager.applyImage(imageView: imageView, image: image)
}
}
}
}
浏览这里的 AlamofireImage 文档,发送下载请求看起来很简单,我觉得我所拥有的至少应该收到一条失败消息。完成块只是一起被跳过,我不完全确定为什么,除非它与文档中的这个有关。
确保保持对 ImageDownloader 实例的强引用,否则将不会调用完成闭包,因为在调用完成闭包之前下载器引用将超出范围。
这可能是一个愚蠢的问题,但是我没有执行上述操作导致没有调用闭包吗?
如果有人有一些见解,那就太棒了。
编辑:包括对 ImageDownloader 的强引用。
编辑#2:将下载分配给变量并打印响应代码返回零。(也许是因为请求是在不同的线程上完成的?)
var downloader: ImageDownloader?
func downloadAndCacheImage(_ url: String, imageView: UIImageView)
{
self.downloader = ImageDownloader()
var urlRequest = try! URLRequest(url: URL(string: "https://solarianprogrammer.com/images/2013/02/28/mandelbrot_piece_Z2.png")!)
let downloadReciept = self.downloader?.download([urlRequest])
print(downloadReciept?[0].request.response) // Returns nil
}
编辑#3:我终于修复了它,我的代码现在看起来像这样:
let downloader = ImageDownloader.default
func downloadAndCacheImage(_ url: String, imageView: UIImageView)
{
var urlRequest = try! URLRequest(url: URL(string: "https://solarianprogrammer.com/images/2013/02/28/mandelbrot_piece_Z2.png")!)
self.downloader.download(urlRequest) { response in
switch response.result{
case .success(let image):
print("\(image) has been downloaded")
break
case .failure(let error):
print("ERROR: \(response.error)")
break
}
if let imageData = response.data{
debugPrint("Applying image...")
if let image = UIImage(data: imageData){
ImageManager.applyImage(imageView: imageView, image: image)
}
}
}
}
我真正改变的是:
let downloader = ImageDownloader()
到:
let downloader = ImageDownloader.default
我真的希望这可以帮助遇到这个问题的任何人!