【问题标题】:Cache to store image and retrieve from stored Cache is not working - iOS Swift缓存以存储图像并从存储的缓存中检索不起作用 - iOS Swift
【发布时间】:2019-08-29 02:38:31
【问题描述】:

我正在尝试下载图像并将该图像存储在缓存中。从下一次尝试中,如果存在,则从缓存中提取该图像,否则下载该图像

我浏览过类似的帖子,但没有什么能帮助我解决问题。

请指教

    let imageCache = NSCache<NSString, UIImage>()
    func getImage(from url: URL, completion: @escaping ((UIImage?, Error?)->(Void))) {
        if let cachedImage = imageCache.object(forKey: url.absoluteString as NSString) {
            print("Image from cache")
            completion(cachedImage, nil)
        }

         NetworkOperations().downloadImage(from: url) { (data, error) in
            if let error = error {
                completion(nil, error)
            } else if let imgData = data, let image = UIImage(data: imgData) {
                self.imageCache.setObject(image, forKey: url.absoluteString as NSString)
                print("Image from cache")
                completion(image, nil)
            }

        }
    }

当我调用这个方法时,它总是通过下载图像来选择。我被击中了

【问题讨论】:

  • imageCache是否每次都被创建?
  • 我想是的。 setObject 行每次都执行
  • 我在问let imageCache = NSCache&lt;NSString, UIImage&gt;() 行。

标签: ios swift caching


【解决方案1】:

在应用程序级别创建一个共享的cache 并在您想要的任何地方添加/检索/删除,如下所示,

class ImageCache {

    private init() {}

    static let shared = NSCache<NSString, UIImage>()
}

用法

func getImage(from url: URL, completion: @escaping ((UIImage?, Error?)->(Void))) {
        if let cachedImage = ImageCache.shared.object(forKey: url.absoluteString as NSString) {
            print("Image from cache")
            completion(cachedImage, nil)
        }

         NetworkOperations().downloadImage(from: url) { (data, error) in
            if let error = error {
                completion(nil, error)
            } else if let imgData = data, let image = UIImage(data: imgData) {
                ImageCache.shared.setObject(image, forKey: url.absoluteString as NSString)
                print("Image from cache")
                completion(image, nil)
            }

        }
    }

我希望,这将解决问题,它还应该让您了解您的实施存在什么问题。很可能您的缓存与声明和使用它的object 具有相同的范围,因此一旦objectde-initialised,缓存也将被释放。

在上述实现中,缓存被声明为static,因此它永远不会是de-initialized,但您可以随时使用以下命令清除缓存,

ImageCache.shared.removeAllObjects()

【讨论】:

  • 这真的很有帮助。我明白哪里出了问题。谢谢@Kamran
猜你喜欢
  • 2018-03-02
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
相关资源
最近更新 更多