9

这可能是预期的行为,但 Apple 并未明确说明。

我正在使用NSCache为我的UICollectionView. 当我将应用程序置于后台并再次(立即)打开它时,我的所有图像都不再位于NSCache.

理想情况下,我希望最近加载的图像保持缓存状态,这样当用户重新打开应用程序时,他们就不必支付再次加载所有图像的费用。似乎NSCache应该允许不那么激进的缓存策略。

我只是想在这里发帖进行完整性检查,并确保我没有遗漏任何明显的东西。

否则,我将不得不实现自己的缓存,将最后 25 个加载的图像保存在NSMutableDictionary缓存中。

4

3 回答 3

5

看起来您需要为放入 NSCache 的对象实现 NSDiscardableContent 协议。当缓存中的对象不符合 NSDiscardableContent 时,它们会根据这个答案在后台应用程序时被驱逐。https://stackoverflow.com/a/13579963

于 2014-01-13T17:52:10.337 回答
3

苹果文档说:

NSCache 类包含各种自动删除策略,确保它不会使用过多的系统内存。如果其他应用程序需要内存,系统会自动执行这些策略。调用时,这些策略会从缓存中删除一些项目,从而最大限度地减少其内存占用。

所以它会删除一些项目,而不是所有项目。它取决于 NSCache 内部策略、可用内存、设备状态等。此外,还要阅读 NSDiscardableContent 协议。

从文档:

默认情况下,如果缓存中的 NSDiscardableContent 对象的内容被丢弃,则会自动从缓存中删除,尽管可以更改此自动删除策略。如果一个 NSDiscardableContent 对象被放入缓存,缓存会在它被移除时调用discardContentIfPossible。

于 2013-11-11T04:04:54.593 回答
0

我也遇到了同样的问题,“当应用程序进入后台时,NSCache 中的缓存图像被驱逐”。我确实创建了一个示例来处理此问题,可在 github https://github.com/SurendraK11/CachingImage/tree/master/CachingImages中找到

导入的东西不在这里,UIImage 没有直接缓存到 NSCache 中。这被包装到 CacheItem 通用类中,该类确认 NSDiscardableContent 其中 isContentDiscarded 返回 false 和 beginContentAccess 返回 true

有关 NSDiscardableContent 的更多信息https://developer.apple.com/documentation/foundation/nsdiscardablecontent

于 2019-05-03T15:38:50.953 回答