Ios 重建项目时缓存图像url不存在
我正在ios中实现图像缓存。 以下是我的功能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
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
是新的初始化。但是你想在你的代码中得到什么。提供磁盘缓存我想要的是,如果我再次重新启动应用程序,我应该能够在没有互联网的情况下从缓存中获取图像。