AlamofireImage 缓存在我的应用程序中不起作用

Posted

技术标签:

【中文标题】AlamofireImage 缓存在我的应用程序中不起作用【英文标题】:AlamofireImage cache doesn't work in my app 【发布时间】:2018-11-15 08:18:47 【问题描述】:

我正在使用 af_setImage() 将图像设置为 UIImageView。我需要缓存图像,如果它被缓存,我希望它不要进行转换。 我在下面尝试了一些代码,但带有标识符的图像缓存总是返回 nil。似乎每次都会调用 imageCache.add() 但它不会添加缓存。

    let imageCache = AutoPurgingImageCache()

    if let image = imageCache.image(withIdentifier: post.mainImage) 
        cell.postImageView.image = image
     else 
        cell.postImageView.af_setImage(
            withURL: URL(string: post.mainImage)!,
            placeholderImage: PostCellView.defaultImage,
            imageTransition: .crossDissolve(0.5),
            completion:  response in
                if let image = response.result.value, response.result.isSuccess 
                    imageCache.add(image, withIdentifier: post.mainImage)
                
            
        )
    

我错了什么?

提前谢谢你(´▽`)

【问题讨论】:

你能解决这个问题吗? 【参考方案1】:

我发现 AutoPurgingImageCache 的主要问题是新实例没有从以前的对象继承缓存,所以如果你把这段代码放在 viewDidLoad 函数中,缓存总是返回 nil

所以我设法用一个静态对象来解决,这就是代码


import UIKit
import AlamofireImage

class ViewController: UIViewController 

    static let imageCache = AutoPurgingImageCache(
        memoryCapacity: 900 * 1024 * 1024,
        preferredMemoryUsageAfterPurge: 600 * 1024 * 1024)

    override func viewDidLoad() 
        super.viewDidLoad()

        let image_url = Bundle.main.object(forInfoDictionaryKey: "IMAGE_URL") as! String
        let name = "/someimage.jpg"

        let url = URL(string: image_url + name)
        let urlRequest = URLRequest(url: url!)

        let img_from_cache = ViewController.imageCache.image( for: urlRequest, withIdentifier: name)

        if img_from_cache != nil
            print("FROM CACHE!!")
            imageView.image = img_from_cache
//            self.setImageViewSize(img_from_cache!)
        else
            print("NOT FROM CACHE!!")
            imageView.af_setImage(
                withURL: url!,
                placeholderImage: nil,
                filter: AspectRatioscaledToWidthFilter(width: self.view.frame.size.width),
                completion : (rs) in
                    ViewController.imageCache.add(self.imageView.image!, for: urlRequest, withIdentifier: name)
                
            )
        

    


/// Scales an image to a specified width and proportional height.
public struct AspectRatioScaledToWidthFilter: ImageFilter 
    /// The size of the filter.
    public let width: CGFloat
    /**
     Initializes the `AspectRatioScaledToWidthFilter` instance with the given width.
     - parameter width: The width.
     - returns: The new `AspectRatioScaledToWidthFilter` instance.
     */
    public init(width: CGFloat) 
        self.width = width
    

    /// The filter closure used to create the modified representation of the given image.
    public var filter: (Image) -> Image 
        return  image in
            return image.af_imageScaled(to: CGSize(width: self.width, height: self.width * image.size.height / image.size.width))
        
    


请注意 af_setImage 函数已经使用缓存,因此您必须将缓存对象用于其他目的,而不是在 UIImage 对象中显示图像,例如在 textView 中显示带有 NSTextAttachment 的图像

【讨论】:

以上是关于AlamofireImage 缓存在我的应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

AlamofireImage : 每次应用启动后缓存为空

将 AlamofireImage 响应缓存到磁盘

AlamofireImage 占位符图像在缓存图像之前简要显示 v3.1

AlamofireImage 下载到 CoreData

在同一个项目中使用 Alamofire 和 AlamofireImage

AlamoFire 图像内存问题