開發(fā)中,有時需要將因特網上下載的圖片保存到字典中,這樣的話稍后使用就無須再次下載了,其實用NSCache類更好,它是Foundation框架專門為處理這種任務而設計的。
NSCache勝于NSDictionary之處在于:
- 當系統(tǒng)資源將要耗盡時,它可以自動刪除最久未使用的緩存。
- NSCache并不會拷貝鍵,而是保留它,在鍵不支持拷貝操作的情況下,使用更方便。
- 可以通過調整緩存中的對象總數和所有對象的“總開銷”來操控緩存刪減器內容的時機,但絕對不要把這倆尺度當成可靠的“硬限制”,它們進對NSCache起指導作用。
- NSCache是線程安全的,不需要編寫加鎖代碼的情況下,多個線程也可以同時訪問NSCache。
將NSPurgeableData與NSCache搭配使用,可實現自動清除數據的功能,也就是說,當NSPurgeableData對象所占內存為系統(tǒng)所丟棄時,該對象自身也會從緩存中移除。
下面是緩存的用法:
#import <Foundation/Foundation.h>
// 網絡數據獲取器類
typedef void(^EOCNetworkFetcherCompletionHandler)(NSData *data);
@interface EOCNetworkFetcher : NSObject
- (id)initWithURL:(NSURL*)url;
- (void)startWithCompletionHandler:(EOCNetworkFetcherCompletionHandler)handler;
@end
// 使用獲取器及緩存結果的類
@interface EOCClass : NSObject
@end
@implementation EOCClass{
NSCache *_cache;
}
- (id)init{
if ((self = [super init])) {
_cache = [NSCache new];
// 設置緩存的對象數目上限為100,總開銷上限為5MB
_cache.countLimit = 100;
_cache.totalCostLimit = 5 * 1024 * 1024;
}
return self;
}
- (void)downloadDataForURL:(NSURL*)url{
// NSPurgeableData為NSMutableData的子類,采用與內存管理類似的引用計數,當引用計數為0時,該對象占用的內存可以根據需要隨時丟棄
NSPurgeableData *cacheData = [_cache objectForKey:url];
if (cacheData) {
// 緩存命中
// 引用計數+1
[cacheData beginContentAccess];
// 使用緩存數據
[self useData:cacheData];
// 引用計數-1
[cacheData endContentAccess];
}else{
// 緩存未命中
EOCNetworkFetcher *fetcher = [[EOCNetworkFetcher alloc] initWithURL:url];
[fetcher startWithCompletionHandler:^(NSData *data) {
// 創(chuàng)建NSPurgeableData對象,引用計數+1
NSPurgeableData *purgeableData = [NSPurgeableData dataWithData:data];
[_cache setObject:purgeableData forKey:url cost:purgeableData.length];
// 使用緩存數據
[self useData:cacheData];
// 引用計數-1
[purgeableData endContentAccess];
}];
}
}
@end