0

我用 NSCache 实现了一个自定义类来缓存一些文章

我发现了一个问题,就是在模拟器上点击主页按钮时,缓存的数据似乎消失了

它将从网络加载数据,但不会从缓存中加载

如果没有点击主页按钮,它将从 NSCache 获取数据

IE。我的缓存代码:

#import "ArticleCache.h"

@implementation ArticleCache

static NSCache *Cache;

+ (void)initialize
{
    [super initialize];

    Cache = [[NSCache alloc] init];
    [Cache setCountLimit: 1000];
}

+ (void)cacheResponse:(NSData *)response forURL:(NSURL *)URL
{
    [Cache setObject:response forKey:URL];
}

+ (NSData *)cachedResponseForURL:(NSURL *)URL
{
    return [Cache objectForKey:URL];
}

@end

// 你们有没有发现这个问题就像一首诗一样,至少每行的最后一个字符和第一个字符是相同的。

4

3 回答 3

0

只是为了让它更清楚......引用NSCache的文档,第三段:

NSCache 对象在以下几个方面与其他可变集合不同:

  • NSCache 类包含各种自动删除策略,确保它不会使用过多的系统内存。如果其他应用程序需要内存, 系统会自动执行这些策略。调用时,这些策略会从缓存中删除一些项目,从而最大限度地减少其内存占用。
  • 您可以从不同的线程添加、删除和查询缓存中的项目,而无需自己锁定缓存。
  • 从 NSCache 对象中检索某些内容会返回一个自动释放的结果。
  • 与 NSMutableDictionary 对象不同,缓存不会复制放入其中的关键对象。

这些特性对于 NSCache 类是必需的,因为如果调用缓存来释放内存,缓存可能会决定在后台异步自动变异。

换句话说,你永远不知道这些对象什么时候会被移除。

于 2014-03-13T07:57:25.953 回答
0

不是缓存 NSData 对象,而是缓存 NSPurgeableData 对象。在你的 + (void)cacheResponse:(NSData *)response forURL:(NSURL *)URL 中,从响应中创建一个 NSPurgeableData 对象并存储它。

+ (void)cacheResponse:(NSData *)response forURL:(NSURL *)URL
{
    [Cache setObject:[NSPurgeableData dataWithData:response] forKey:URL];
}
于 2014-03-13T04:02:23.593 回答
0

这是 NSCache 的预期行为。如果您想让缓存被清除并再次从服务器中提取数据,或者如果您想在应用程序进入后台时将其保存在其他地方,这取决于您和您的设计。

于 2014-03-13T03:10:20.333 回答