Ios 重建项目时缓存图像url不存在

Ios 重建项目时缓存图像url不存在,ios,swift,caching,nscache,Ios,Swift,Caching,Nscache,我正在ios中实现图像缓存。 以下是我的功能 struct DownloadImage { static let cache = NSCache<NSString,UIImage>() static func downloadImage(with url: URL,completion: @escaping (_ image: UIImage?) -> ()) { let dataTask = URLSession.shared.dataTask(with: url

我正在ios中实现图像缓存。 以下是我的功能

struct DownloadImage {

static let cache = NSCache<NSString,UIImage>()

static func downloadImage(with url: URL,completion: @escaping (_ image: UIImage?) -> ()) {
    let dataTask = URLSession.shared.dataTask(with: url) { (data, responseURL, error) in
        var downloadedImage: UIImage?

        if let data = data {
            downloadedImage = UIImage(data: data)
        }
        if downloadedImage != nil {
            cache.setObject(downloadedImage!, forKey: url.absoluteString as NSString)
        }
        DispatchQueue.main.async {
            completion(downloadedImage)
        }
    }
    dataTask.resume()
}


static func getImage(withURL url:URL,completion: @escaping (_ image: UIImage?) -> ()) {
    if let image = cache.object(forKey: url.absoluteString as NSString) {
        completion(image)
    } else {
        downloadImage(with: url, completion: completion)
    }
}  
struct DownloadImage{
静态let cache=NSCache()
静态func下载映像(url:url,完成:@escaping(u-image:UIImage?)->()){
让dataTask=URLSession.shared.dataTask(带:url){(data,responseURL,error)在
var下载图像:UIImage?
如果let data=data{
DownloadeImage=UIImage(数据:数据)
}
如果下载图像!=无{
cache.setObject(下载图像),forKey:url.absoluteString作为NSString)
}
DispatchQueue.main.async{
完成(下载图像)
}
}
dataTask.resume()
}
静态func getImage(带url:url,完成:@escaping(u-image:UIImage?)->()){
如果让image=cache.object(forKey:url.absoluteString作为NSString){
完成(图像)
}否则{
下载图像(带:url,完成:完成)
}
}  
}

图像已缓存,但当我再次重建项目时,即使在同一URL?上也会调用下载图像功能

有人能告诉我我遗漏了什么,或者为什么调用下载图像功能吗?

只是一种幻想。它不应该在会话期间保持不变,也不能保证即使在会话期间也能将对象保留在内存中


因此,在您的特定情况下,每次重建应用程序时都会重新创建缓存。

正如其他人所提到的,您需要的是持久内存

要保存它们,您可以执行以下操作:

let fileCoordinator = NSFileCoordinator()
fileCoordinator.coordinate(writingItemAt: someURL, options: .forReplacing, error: nil, byAccessor: { _ in
     do {
          try UIImagePNGRepresentation(image)?.write(to: someURL)
     } catch let error as NSError {
          print (error)
     }
})
然后阅读:

if let data = Data(contentsOf: someURL), let image = UIImage(data: data!) }
    return image
} else {
    print ("something wrong reading the image"
}

NSCache
是内存缓存。缓存内容不会在应用程序重新启动时保持不变。
NSCache
对象正在使用存储图像,但您重建项目或杀死应用程序并重新启动,然后
cache
是新的初始化。但是你想在你的代码中得到什么。提供磁盘缓存我想要的是,如果我再次重新启动应用程序,我应该能够在没有互联网的情况下从缓存中获取图像。