我使用NSCache实现一个自定义类来缓存一些文章
我发现了一个问题,就是在模拟器上按下主页按钮时,缓存的数据似乎消失了
它将从网络加载数据,但不加载缓存
如果没有点击主页按钮,它将从NSCache
获取数据即。我的缓存代码:
#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
//难道你们不是发现这个问题就像一首诗,至少是最后一个字符和每行的第一个字符是相同的。
答案 0 :(得分:0)
这是NSCache的预期行为。如果您想要清除缓存并从服务器再次提取数据,或者当应用程序要进入后台时将其保存在其他位置,则由您和您的设计决定。
答案 1 :(得分:0)
而不是缓存NSData对象,而是缓存NSPurgeableData对象。在您的+(void)cacheResponse:(NSData *)响应forURL:(NSURL *)URL中,从响应创建一个NSPurgeableData对象并存储它。
+ (void)cacheResponse:(NSData *)response forURL:(NSURL *)URL
{
[Cache setObject:[NSPurgeableData dataWithData:response] forKey:URL];
}
答案 2 :(得分:0)
只是为了让它更清晰......引用NSCache
文档,第三段:
NSCache对象在几个方面与其他可变集合不同:
- NSCache类包含各种自动删除策略,可确保它不会占用太多的系统内存。该 如果需要内存,系统会自动执行这些政策 其他应用。调用时,这些策略会删除一些项目 从缓存中减少内存占用。
- 您可以从不同的线程添加,删除和查询缓存中的项目,而无需自行锁定缓存。
- 从NSCache对象中检索内容会返回自动释放的结果。
- 与NSMutableDictionary对象不同,缓存不会复制放入其中的密钥对象。
这些功能对于NSCache类是必需的,因为缓存可能 决定在幕后异步自动变异 如果它被调用以释放内存。
换句话说,你永远不知道什么时候会删除这些对象。