我正在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)
}
}
}
图像已被缓存,但是当我再次重建项目时,即使在相同的URL上也会调用下载图像功能。
有人可以告诉我我所缺少的内容还是为什么要下载图像功能吗?
答案 0 :(得分:1)
正如其他所有人所提到的,您需要的是持久性内存。
您可以保存它们的是:
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"
}
答案 1 :(得分:0)
NSCache只是个幻想NSDictionary。它不应该在会话中持续存在,并且即使在会话期间也不能保证将对象保留在内存中。
因此,在您的特定情况下,每次您重建应用程序时都会重新创建缓存。