項(xiàng)目地址? https://github.com/enormego/EGOCache/
EGOCache是一個(gè)輕量級(jí)的緩存框架。用法簡(jiǎn)單方便,在現(xiàn)在的項(xiàng)目中,我就用到EGOCache來緩存下載過的照片和字符串,還能設(shè)置這些存儲(chǔ)值的有效時(shí)間。
簡(jiǎn)單用法
NSString* saveString=@"xxx";
[[EGOCacheglobalCache]setString:saveStringforKey:@"xxx"withTimeoutInterval:24*60*60];
NSString* xxx=[[EGOCacheglobalCache]stringForKey:@"xxx"];
NSLog(@"xxx=%@",xxx);
學(xué)習(xí)筆記
1. 對(duì)于一些常用的代碼片段可以使用宏定義,減少冗余代碼
#if DEBUG
#define CHECK_FOR_EGOCACHE_PLIST() if([key isEqualToString:@"EGOCache.plist"]) { \
NSLog(@"EGOCache.plist is a reserved key and can not be modified."); \
return; }
#else
#define CHECK_FOR_EGOCACHE_PLIST() if([key isEqualToString:@"EGOCache.plist"]) return;
#endif
2.內(nèi)聯(lián)函數(shù)的使用, 消除函數(shù)調(diào)用時(shí)的時(shí)間開銷 ,同事代碼也比較簡(jiǎn)潔
static ?inline ?NSString* cachePathForKey(NSString* directory,NSString* key) {
key = [keystringByReplacingOccurrencesOfString:@"/"withString:@"_"];
return[directorystringByAppendingPathComponent:key];
}
3.文中大量使用了GCD技術(shù),這里不詳細(xì)介紹GCD,請(qǐng)大家參考一本PDF教程
下載地址 ? ?http://download.csdn.net/detail/dongsh315/7240711?
4.單例模板
+ (instancetype)globalCache {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});a
return instance;
}
5. 在刪除文件時(shí)避免要?jiǎng)h的文件和存儲(chǔ)本地的文件重名
- (void)removeCacheForKey:(NSString*)key {
CHECK_FOR_EGOCACHE_PLIST(); ? //巧妙之處
dispatch_async(_diskQueue, ^{
[[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
});
[self setCacheTimeoutInterval:0 forKey:key];
}
6.這里是設(shè)置 _frozenCacheInfoQueue? _cacheInfoQueue? 兩個(gè)變量的原因 , 兩個(gè)都是用來保存鍵值對(duì)的字典 ,比較文中的代碼發(fā)現(xiàn),? 代碼很相似 , 區(qū)別是? _cacheInfoQueue 多了 self.frozenCacheInfo= [_cacheInfocopy]; 和 [selfsetNeedsSave];? 從注釋中就可以看出 _frozenCacheInfo 是為了快速讀出新值的需要? 而 _cacheInfocopy是為了保存寫入文件的需要 _cacheInfocopy滯后一些 。

7. 存儲(chǔ)值的有效時(shí)間思路
存儲(chǔ)時(shí)把時(shí)間存下來就好了 下次讀出時(shí)如果時(shí)間比當(dāng)前時(shí)間小說明 失效