ios - 如何正确使用NSCache?

标签 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)")
}

当我看到日志输出时,它总是打印“未缓存测试”。就像它从未缓存过任何东西一样。我不知道如何解决这个问题,这让我心烦意乱了几天。

提前致谢。

最佳答案

When I see the log output, it prints always "Not cached Testing". Just like if it never cached anything. I don't know how can I fix this, it got on my nerves for a couple of days.

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

What I think my problem is, it's that when I re-build the app, the cache clears itself. However when I restart the app it said again "Not cached" on the first line.

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

用于临时存储临时键值对的可变集合,当资源不足时这些键值对可能会被驱逐。

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

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

关于ios - 如何正确使用NSCache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57563697/

相关文章:

ios - UICollectionViewCell 点击不会正确注册

ios - 下载图像并使用 SwiftyJSON 将其保存为 json

ios - 为什么从 viewWillAppear 或 viewDidAppear 中显示和隐藏 View 不起作用

ios - swift 错误 : Could not find an overload for '==' that accepts the supplied arguments?

ios - didSelectRowAt 没有被调用

swift - 在 Swift 中,如何编写公开另一个通用协议(protocol)的协议(protocol)?

ios - 将 uibutton 聚焦在 uicollectionviewCell 内

swift - 处理来自 firebase 的 Null ref

iOS - 几天后应用程序崩溃 - videosubcriptionsd

javascript - iOS 设备上不显示 Google 图表