2014-03-13 23 views
0

我實現與NSCache定製類緩存一些文章NSCache後擊中home鍵到期

我發現了一個問題,那就是雖然打在模擬器的home鍵,緩存的數據似乎消失了

會加載來自網絡的數據,但不能緩存

如果不打回家按鈕,它會從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

這是NSCache的預期行爲。如果您想清除緩存並從服務器再次提取數據,或者如果您希望在應用程序要進入後臺時將其保存在別處,則取決於您和您的設計。

+0

非常感謝,我與用戶默認會緩存它。 – hlcfan

+0

沒問題。這可能不是你想用UserDefaults保存的東西。它們通常用於用戶設置和偏好。您可能會發現將這些網址保存到文件並將其保存到未由iTunes/iCloud備份的文件夾中的結果會更好。 – Inertiatic

0

相反緩存NSData的對象,緩存NSPurgeableData對象,而不是。在您的+(void)cacheResponse :(NSData *)響應URL(NSURL *)URL中,根據響應創建NSPurgeableData對象並將其存儲。

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

thx,我用sqlite做到了。 – hlcfan

0

只是爲了使它更清晰的......引用NSCache文檔,第三款:

NSCache對象從其他可變集合不同在幾個方面:

  • 的NSCache類合併了各種自動刪除策略,確保它不會佔用太多的系統內存。該 系統自動執行這些政策如果被其他 應用程序所需的內存。在調用時,這些策略會從緩存中刪除一些項目 ,從而最大限度地減少內存佔用量。
  • 您可以添加,刪除,而無需自己鎖定緩存在不同的線程緩存查詢項目。
  • 從NSCache對象中檢索某些內容會返回一個自動釋放的結果。
  • 不像一個NSMutableDictionary對象,緩存不會複製投入它的主要對象。

這些功能所必需的NSCache類,如高速緩存可以 決定它是否被調用來釋放內存異步自動變異本身幕後 後面。

換句話說,你永遠不知道什麼時候這些對象會被刪除。