第50條:構建緩存時選用NSCache而非NSDictionary

開發(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
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容