没有回复或完成块跳过AlamofireImage

时间:2017-07-28 16:09:17

标签: ios swift alamofire alamofireimage

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

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

2 个答案:

答案 0 :(得分:1)

你需要:

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

    ...

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

        ...
    }
}

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

您当前的downloaderdownloadAndCacheImage()的本地/自动变量。它在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)
            }
        }
    }
}

希望这可以帮助遇到它的人!