当应用程序进入后台时,NSCache总是驱逐图像数据

时间:2013-11-11 03:53:10

标签: ios nscache

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

我正在使用NSCache为我的UICollectionView缓存一些图片。当我将应用程序放在后台并立即再次打开时,我的所有图像都不在NSCache中。

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

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

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

3 个答案:

答案 0 :(得分:3)

苹果医生说:

  

NSCache类包含各种自动删除策略   确保它不会占用太多的系统内存。该   如果需要内存,系统会自动执行这些策略   其他应用。调用时,这些策略会删除一些项目   从缓存中,最小化其内存占用。

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

来自文档:

  

默认情况下,缓存中的NSDiscardableContent对象是   如果丢弃其内容,则自动从缓存中删除   虽然可以更改此自动删除策略。如果   NSDiscardableContent对象被放入缓存中,缓存调用   discardContentIfPossible它被删除。

答案 1 :(得分:3)

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

答案 2 :(得分: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

的更多信息