NSCache,图像缓存,不缓存(Xcode 11,Swift 5)

NSCache, Image Cache, not caching (Xcode 11, Swift 5)

我正在努力加载缓存图像。在按下按钮时,我要么显示缓存的图像,要么下载它然后保存到缓存。第一次点击时,我的标签显示 "Download From Web, and on the second click it loads from cache as I get " 从缓存中加载

但是,当我重新启动应用程序时,我再次获得了两个标签,就像图像实际上没有缓存一样,第一次点击时 "Download from web",此后任何点击时 "loaded from cache"。

    let imageCache = NSCache<AnyObject, AnyObject>()



    @IBAction func Button(_ sender: Any)//download charts
    {
    let imageUrl = URL(string: "https://www.vedur.is/photos/flugkort/PGDE14_EGRR_0000.png")

    if let imageFromCache = imageCache.object(forKey: imageUrl as AnyObject) as? UIImage {
        self.Image1.image = imageFromCache
        self.Image2.text = "Loaded from cache"
        return
    }

    URLSession.shared.dataTask(with: imageUrl!) { data, response, error in
        if let data = data { DispatchQueue.main.async
            {
                let imageToCache = UIImage(data: data)
                imageCache.setObject(imageToCache!, forKey: imageUrl as AnyObject)
                self.Image1.image = imageToCache
                self.Image2.text = "Downloaded From Web"
            }

        }
    }.resume()
}

However, when i restart the app i get both labels once again, like the image didn't actually cache

那是因为NSCache是内存缓存,不是磁盘缓存。您添加到 NSCache 实例的内容在重新启动后不会持久存在。如果你想避免在重启你的应用后从网络获取相同的图像,你需要将图像保存到辅助存储并在应用启动时读回它,或者当你再次需要图像时。 NSCache 会尽可能将对象保留在内存中,然后在内存不足时释放它们。因此,一旦您下载了图像并将其保存到磁盘,就可以将其保存在 NSCache 中以将其保存在内存中,这样您就不必再次访问磁盘。如果您手边有大量图像或其他大型资源,但如果需要也可以再次阅读,这有助于提高性能。

如果需要使用swift缓存,可以试试swiftlycache,这是一个用swift写的缓存库 5.符合代码的类型都可以直接访问,或仅用于内存缓存和磁盘缓存。或许你会喜欢