重建项目时不存在缓存图像URL

时间:2019-03-11 07:22:45

标签: 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) { (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上也会调用下载图像功能。

有人可以告诉我我所缺少的内容还是为什么要下载图像功能吗?

2 个答案:

答案 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。它不应该在会话中持续存在,并且即使在会话期间也不能保证将对象保留在内存中。

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