如何正确使用NSCache?

时间:2019-08-19 20:43:00

标签: ios swift

我想用NSCache保存字符串(或其他任何东西)时遇到问题,尽管我看到了很多教程和复制粘贴的代码。

现在我最后一次尝试的方法是缓存一个简单的字符串,然后将其检索出来,以供测试。

let cache = NSCache<NSString, NSString>()
if let cachedObject = cache.object(forKey: "test" as NSString) {
    print("Cached \(cachedObject)")
} else {
    let test = "Testing"
    cache.setObject(test as NSString, forKey: "test" as NSString)
    print("Not cached \(test)")
}

当我看到日志输出时,它总是打印“ Not cached Testing”。就像它从未缓存过任何东西一样。我不知道该如何解决,这让我紧张了几天。

谢谢。

1 个答案:

答案 0 :(得分:0)

  

当我看到日志输出时,它总是打印“ Not cached Testing”。就像它从未缓存过任何东西一样。我不知道该如何解决,这让我紧张了几天。

在循环中运行相同的代码。第一次,您会收到未缓存消息,因为该对象尚未添加到缓存中。在循环中的每个后续时间,您都会得到缓存,因为该对象将被添加到缓存中。

  

我认为我的问题是,当我重新构建应用程序时,缓存会自行清除。但是,当我重新启动应用程序时,它在第一行再次说“未缓存”。

是的,这是预期的行为。 Paulw11在上面的评论中正确指出了NSCache不是持久性的。也就是说,缓存中的对象不会写入磁盘。缓存及其内容仅存在于内存中。 NSCache reference page说:

一个可变的集合,用于临时存储在资源不足时可能被逐出的瞬态键值对。

将NSCache视为字典,可以用来存储大型对象(例如图像),而不必担心使用过多的内存。假设您正在写相册,并且希望避免每次需要时从磁盘上重新读取照片,但是同时您不能拥有全部 立即存储在内存中,因为那样会占用太多内存。因此,您可以为照片创建一个NSCache实例。从磁盘读取照片之前,可以尝试从缓存中获取照片。如果不存在,则从磁盘读取它,然后将其添加到缓存中。另一方面,如果对象位于中,则无需再次读取即可获取它,这会使您的应用程序性能更好。

请勿使用NSCache存储您无法以其他方式重新创建的数据(例如,从磁盘重新读取或重新计算)。并且知道当应用程序退出时,缓存将与内存中的所有其他对象一起消失。