ios - 如何在iOS应用程序中正确使用NSCache?

标签 ios swift xcode caching nscache

我正在构建一个应用程序,并希望使用 NSCache 来存储数据以进行缓存。

大约有 5 个 API 需要我缓存数据。我应该使用 NSCache 吗?我对 NSCache 进行了研究,但对此我有一些疑问。

我确实浏览了下面的链接。

https://developer.apple.com/library/content/documentation/Performance/Conceptual/ManagingMemory/Articles/CachingandPurgeableMemory.html

我在那里发现了一些有趣的东西。

NSCache provides two other useful "limit" features: limiting the number of cached elements and limiting the total cost of all elements in the cache. To limit the number of elements that the cache is allowed to have, call the method setCountLimit:. For example, if you try to add 11 items to a cache whose countLimit is set to 10, the cache could automatically discard one of the elements.

如果我们将限制设置为 10,并且尝试添加第 11 项,那么它将丢弃第 1 项还是第 10 项?或者它可以是随机项目。

如果我想为所有 API 存储 5 个不同的 NSCache 对象,我该怎么做? 我应该创建 5 个不同的 NSCache 对象,还是应该在单个 NSCache 对象中存储 5 个不同的字典?

请让我知道处理该问题的最佳方法。

最佳答案

NSCache 基本上作为一个 NSMutableDictionary 工作,主要区别在于即使是可变的也是线程安全的(通常可变的 NSFoundation 对象不是线程安全的)。因此,您可以使用键获取和设置对象。
是的,文档不清楚,但我记得(这是有道理的),您应该始终检测对象是否被缓存,如果没有从主要源重新加载它或管理特定情况。因此,删除哪个对象并不重要,只需确保在某个时刻某个对象不再存在,并且您正在管理这种情况即可。
我通常根据不同的上下文创建不同的缓存,但大多数时候一个就足够了。
我有一些建议:

  • 您的答案被标记为 Swift,因此请注意 NSCache (在 swift 2 中,在 3 中不知道)仅适用于对象,而不适用于结构或枚举(值类型,除非它们可以是桥接)。
  • 记住http协议(protocol)有自己的缓存系统和通信,不要重新发明轮子

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

相关文章:

ios - 对于iOS开发人员,XCode 4.2(iOS5)和XCode 4.5(iOS 6)之间有很多区别吗?

javascript - iOS上的Cordova:应用程序在发送到后台之前没有音频

ios - 不使用桥接 header 访问私有(private) UIKit 函数

swift - Microsoft 通过 Firebase 登录

ios - 是什么导致此 Crashlytics 编译警告? (自动链接在 '...' 处提供的 '...' 框架链接器选项不是 dylib)

swift - 移除 NSOutlineView 周围的边框

ios - IBOutlet for element in containerview inside original viewcontroller

ios - 框架的接触方法

ios - 设计模块化 iOS 项目的建议?

ios - 导航栏中的标题文本不会立即截断