EGOCache簡介
EGOCache is a simple, thread-safe key value cache store. It has native support for NSString, UI/NSImage, and NSData, but can store anything that implements <NSCoding>. All cached items expire after the timeout, which by default, is one day.
翻譯過去就是:EGOCache一個簡略、線程平安的基於 key-value 的緩存框架,原生支撐NSString、UI/NSImage、和NSData,也支撐貯存任何完成協定的類,可以設定緩存過時時光,默許是1天。
EGOCache只要一個類,EGOCache.h和EGOCache.m兩個文件。用法也比擬輕易控制,細心研討一下EGOCache.h的辦法,很快便可以上手。
EGOCache只供給了磁盤緩存,沒有供給內存緩存。同時,也供給了清算緩存的辦法:
- (void)clearCache;
EGOCache還供給了斷定緩存能否存在的辦法:
- (BOOL)hasCacheForKey:(NSString* __nonnull)key;
經由過程Cocoapods直接參加項目
直接在你的項目標Podfile參加上面一行:
pod 'EGOCache'
然後履行:
$ pod update
EGOCache用法
用EGOCache緩存NSString
存儲:
NSString *saveString = @"把我保留起來吧";
[[EGOCache globalCache] setString:saveString forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[saveString hash]] withTimeoutInterval:24*60*60];
讀取:
NSString *getSaveString = [[EGOCache globalCache] stringForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveString" hash]]];
是否是感到跟NSDictionary很類似,確切,後面我們說了EGOCache是基於key-value 的緩存框架。
用EGOCache緩存UIImage
存儲:
UIImage *saveImage = [UIImage imageNamed:@"IOSDevTip"];
[[EGOCache globalCache] setImage:saveImage forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveImage" hash]] withTimeoutInterval:24*60*60];
讀取:
UIImage *getSaveImage = [[EGOCache globalCache] imageForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveImage" hash]]];
用EGOCache緩存NSData
存儲:
NSData *saveData = [NSData data];
[[EGOCache globalCache] setData:saveData forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveData" hash]] withTimeoutInterval:24*60*60];
讀取:
UIImage *getSaveData = [[EGOCache globalCache] dataForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveData" hash]]];
EGOCache若何檢測緩存時光過時
EGOCache可以設定緩存過時時光,默許是1天。檢查了一下EGOCache源碼,設置默許時光:
[self setDefaultTimeoutInterval:86400];
//86400 = 24 * 60 * 60 恰好是一地利間。
EGOCache為何要供給設定緩存過時時光呢?或許說設定緩存過時時光有甚麼利益呢?我認為最年夜的利益就是可以准時消除緩存。可以設置某一項的緩存時光,很便利治理緩存。
那末成績來了:
帶著這兩個成績,我們來持續剖析。
你會怎樣完成
記得在公司裡,老板常常會舉如許的例子:
某某同志,剛來我們公司的時刻,碰到成績就曉得埋怨。歷來不曉得去思慮怎樣處理,只曉得把成績拋給引導。任務半年上去,生長了許多。如今碰著成績,不只把成績拋出來,並且還供給了本身的處理計劃...
相似的例子,信任年夜家都聽過。異樣,既然後面我們提出這兩個成績,我們也先來思慮一下,假如我們來做該怎樣處理?
假如讓我來寫的話,我腦海裡初步完成辦法有幾個:
為了小小的緩存時光,就用准時器輪詢,明顯是資本糟蹋
跟辦法1差不多。
每次讀取的時刻斷定能否過時,假如一向不讀取,app的緩存會愈來愈年夜,也弗成取。
這些辦法都被消除了,還有好的辦法嗎?持續往下看:
EGOCache是怎樣完成的?
細心檢查EGOCache源碼,發明在initWithCacheDirectory:辦法裡,每次初始化EGOCache實例對象的時,會遍歷一遍plist文件中一切已存在的緩存項,拿每一個緩存項的時光和以後時光作比擬,緩存項過時時光早於以後時光,則刪除對應緩存文件,並刪除 plist 文件中對應 key 的記載。
詳細完成代碼以下:
讀取緩存項信息
_cacheInfo = [[NSDictionary dictionaryWithContentsOfFile:cachePathForKey(_directory, @"EGOCache.plist")] mutableCopy];
if(!_cacheInfo) {
_cacheInfo = [[NSMutableDictionary alloc] init];
}
獲得以後時光的NSTimeInterval
NSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate];
聲明removedKeys保留過時的緩存項對應的key
NSMutableArray* removedKeys = [[NSMutableArray alloc] init];
遍歷緩存項信息並斷定緩存時光
for(NSString* key in _cacheInfo) {
//斷定緩存項過時時光能否早於以後時光
if([_cacheInfo[key] timeIntervalSinceReferenceDate] <= now) {
//假如緩存項過時時光早於以後時光,移除緩存項
[[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
//把過時的緩存項關於的key保留到removedKeys外面
[removedKeys addObject:key];
}
}
刪除過時緩存項關於的key
[_cacheInfo removeObjectsForKeys:removedKeys];
看到這些,是否是認為人家思緒特牛叉,橫豎,我是認為這個作者不簡略。到這一步就處理了嗎?
EGOCache還做了甚麼?
仔細的童鞋會發明:EGOCache是個單列類,也就是說全部法式運用周期只初始化一次。
+ (instancetype)globalCache {
static id instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[[self class] alloc] init];
});
return instance;
}
每次初始化的時刻去斷定了緩存項能否過時,如許做異常准確。思慮一個場景:
用戶翻開app,EGOCache被初始化,並斷定了緩存項能否過時。
假如恰好有一些緩存項在EGOCache被初始化以後過時。這個時刻我們仍然可以讀到這個緩存項。這就纰謬了。
持續剖析EGOCache源碼發明,EGOCache在讀取一個緩存項的時刻,先斷定緩存項能否存在,然後讀取緩存項(留意:是讀取EGOCache初始化的時刻沒有過時的緩存項,並沒有說如今沒有過時),最初去斷定讀取到的緩存項跟以後時光比擬能否過時.
詳細完成以下:
- (BOOL)hasCacheForKey:(NSString*)key {
//讀取EGOCache初始化的時刻沒有過時的緩存項
NSDate* date = [self dateForKey:key];
if(date == nil) return NO;
//斷定讀取到的緩存項以後能否過時
if([date timeIntervalSinceReferenceDate] < CFAbsoluteTimeGetCurrent()) return NO;
return [[NSFileManager defaultManager] fileExistsAtPath:cachePathForKey(_directory, key)];
}
- (NSDate*)dateForKey:(NSString*)key {
__block NSDate* date = nil;
dispatch_sync(_frozenCacheInfoQueue, ^{
date = (self.frozenCacheInfo)[key];
});
return date;
}
EGOCache檢測緩存時光過時的思緒值得進修,今後碰到相似場景,完整可以自創。
【Objective-C的緩存框架EGOCache在iOS App開辟中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!