所以我在尝试让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文档here,发送下载请求看起来非常简单,我觉得我拥有的东西至少应该是一个失败的消息。完成块刚刚被一起跳过,我不完全确定为什么除非它与文档中的内容有关。
确保对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
我真的希望这可以帮助任何遇到这个问题的人!
答案 0 :(得分:1)
你需要:
class MyClass
{
var downloader: ImageDownloader? // This acts as the 'strong reference'.
...
func downloadAndCacheImage(_ url: String, imageView: UIImageView)
{
self.downloader = ImageDownloader()
...
}
}
因为下载发生在downloadAndCacheImage()
返回后(使用其他线程)。
您当前的downloader
是downloadAndCacheImage()
的本地/自动变量。它在downloadAndCacheImage()
结束时发布。这会过早地停止/削减下载过程。
答案 1 :(得分:1)
我设法通过将代码更改为以下来解决我的问题。出于某种原因,下面的行更改修复了它。
让downloader = ImageDownloader()
到
让downloader = ImageDownloader.default
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)
}
}
}
}
希望这可以帮助遇到它的人!