1

所以我在尝试让 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

我真的希望这可以帮助遇到这个问题的任何人!

4

2 回答 2

1

你需要:

class MyClass
{
    var downloader: ImageDownloader? // This acts as the 'strong reference'.

    ...

    func downloadAndCacheImage(_ url: String, imageView: UIImageView)
    {
        self.downloader = ImageDownloader()

        ...
    }
}

因为下载发生在您downloadAndCacheImage()返回后(使用其他线程)。

您的 currentdownloaderdownloadAndCacheImage(). 它在downloadAndCacheImage()结束时被释放。这会过早停止/切断下载过程。

于 2017-07-28T16:16:50.280 回答
0

我设法通过将我的代码更改为以下来解决我的问题。由于某种原因,下面的行更改修复了它。

让下载器 = ImageDownloader()

让下载器 = 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)
            }
        }
    }
}

希望这对遇到它的人有所帮助!

于 2017-07-31T12:54:25.297 回答