亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

Objective-C的緩存框架EGOCache在iOS App開發中的使用

2020-07-26 03:21:03
字體:
來源:轉載
供稿:網友

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];

讀?。?br />
復制代碼 代碼如下:

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為什么要提供設定緩存過期時間呢?或者說設定緩存過期時間有什么好處呢?我覺得最大的好處就是可以定時清除緩存??梢栽O置某一項的緩存時間,很方便管理緩存。

那么問題來了:

  • EGOCache是怎么檢測緩存過期時間的呢?
  • 檢測到時間過期之后,什么時候觸發刪除緩存項的?

帶著這兩個問題,我們來繼續分析。

你會怎么實現

記得在公司里,老板經常會舉這樣的例子:

某某同志,剛來我們公司的時候,遇到問題就知道抱怨。從來不知道去思考怎么解決,只知道把問題拋給領導。工作半年下來,成長了很多?,F在碰到問題,不僅把問題拋出來,而且還提供了自己的解決方案...
類似的例子,相信大家都聽過。同樣,既然前面我們提出這兩個問題,我們也先來思考一下,如果我們來做該怎么解決?

如果讓我來寫的話,我腦海里初步實現方法有幾個:

  • 通過定時器來輪詢,每隔一段時間檢測一次。
  • 寫一個while循環來檢測。
  • 每次去讀取緩存項的時候,判斷緩存時間有沒有過期。沒過期,就返回讀取的緩存項;否則,返回nil。
  • 當然,還有一些方法,不一一例舉了。仔細想想,這些方法弊端很容易顯露出來。

為了小小的緩存時間,就用定時器輪詢,顯然是資源浪費
跟方法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檢測緩存時間過期的思路值得學習,以后遇到類似場景,完全可以借鑒。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色av播放免费| 欧美激情一区二区三区在线视频观看| 久久噜噜噜精品国产亚洲综合| 55夜色66夜色国产精品视频| 国产精品羞羞答答| 欧美日韩亚洲激情| 国产精品成人一区二区三区吃奶| 色婷婷成人综合| 91精品啪在线观看麻豆免费| 久久影院模特热| 亚洲人成网站777色婷婷| 91精品国产成人| 欧美在线免费视频| 亚洲成**性毛茸茸| 91av在线视频观看| 久久99久久99精品免观看粉嫩| 在线观看国产精品91| 亚洲午夜av久久乱码| 国产91露脸中文字幕在线| 亚洲精品456在线播放狼人| 精品久久久久久久久久国产| 国产成人涩涩涩视频在线观看| 欧美一区二区三区图| 国产综合在线观看视频| 欧美极品在线视频| 中文字幕日韩av综合精品| 中文字幕日本精品| 97婷婷大伊香蕉精品视频| 精品露脸国产偷人在视频| 国产精品成熟老女人| 亚洲а∨天堂久久精品喷水| 亚洲另类激情图| 国产成人中文字幕| 日韩中文视频免费在线观看| 国产一区二区激情| 国产一区二区丝袜| 亚洲国产精品一区二区久| 亚洲国产精品一区二区久| 日韩亚洲综合在线| 久久免费国产视频| 亚洲人在线视频| 欧美在线视频免费播放| 成人福利网站在线观看11| 在线日韩日本国产亚洲| 国产噜噜噜噜噜久久久久久久久| 日韩中文字幕网站| 国产精品1区2区在线观看| 国产午夜精品美女视频明星a级| 久久人人爽人人爽爽久久| 亚洲成人av中文字幕| 亚洲人午夜精品| 久久成年人视频| 成人亚洲欧美一区二区三区| 欧美日韩性视频在线| 高清日韩电视剧大全免费播放在线观看| 亚洲综合一区二区不卡| 国产一区二区三区在线| 日韩av手机在线观看| 久久久久免费精品国产| 久久综合伊人77777| 久久久久久久久久久免费| 日日狠狠久久偷偷四色综合免费| 日韩三级成人av网| 日本久久亚洲电影| 欧美激情精品久久久| 亚洲欧美日韩天堂一区二区| 777777777亚洲妇女| 亚洲精品国偷自产在线99热| 日韩中文字幕在线精品| 国产精品亚洲激情| 视频在线观看一区二区| 欧美激情亚洲综合一区| 中文字幕日韩有码| 性欧美激情精品| 欧美中文在线视频| 亚洲日本欧美日韩高观看| 亚洲成人激情在线| 成人淫片在线看| 成人免费视频xnxx.com| 亚洲无限av看| 国产精品劲爆视频| 国模精品视频一区二区三区| 欧美自拍视频在线观看| 性欧美长视频免费观看不卡| 欧美一性一乱一交一视频| 一区二区三区高清国产| 亚洲人成在线观看网站高清| 欧美极品美女视频网站在线观看免费| 亚洲a∨日韩av高清在线观看| 日韩视频免费在线观看| 国产精品主播视频| 日本欧美中文字幕| 精品国产户外野外| 日韩欧美成人网| 精品国产31久久久久久| 国产精品日韩在线播放| 欧美激情第99页| 国产精品极品美女在线观看免费| 97精品一区二区视频在线观看| 亚洲欧美激情另类校园| 亚洲视频999| 亚洲影院色无极综合| 一区二区三区国产在线观看| 激情亚洲一区二区三区四区| 日韩国产高清视频在线| 日韩视频免费大全中文字幕| 午夜精品视频网站| 久久精品色欧美aⅴ一区二区| 成人欧美一区二区三区在线湿哒哒| 亚洲综合视频1区| 91麻豆桃色免费看| 91夜夜未满十八勿入爽爽影院| 亚洲欧美在线第一页| 日本久久精品视频| 人人澡人人澡人人看欧美| 久久久综合免费视频| 欧美激情乱人伦一区| 国产欧美日韩亚洲精品| 国产精品一区二区女厕厕| 欧美性高潮在线| 欧美人交a欧美精品| 亚洲欧美第一页| 欧美电影电视剧在线观看| 亚洲精品国产综合久久| 久久国内精品一国内精品| 亚洲国产成人精品久久久国产成人一区| 久久成人这里只有精品| 亚洲a中文字幕| 成人国产精品免费视频| 欧美精品久久久久久久久久| 国产日产欧美a一级在线| 97国产真实伦对白精彩视频8| 欧美中文在线字幕| 成人精品一区二区三区| 亚洲精品综合精品自拍| 精品亚洲精品福利线在观看| 国产精国产精品| 九九热在线精品视频| 国产精品看片资源| 国产精品久久久久久亚洲影视| 国产精品欧美一区二区三区奶水| 欧美高清不卡在线| 亚洲va男人天堂| 欧美性生交大片免网| 国产欧美一区二区白浆黑人| 欧美在线视频a| 国产精品国产自产拍高清av水多| 成人精品视频99在线观看免费| 国产成人免费av电影| 国自产精品手机在线观看视频| 中文字幕亚洲欧美| 日韩小视频网址| 日韩乱码在线视频| 久久99久久久久久久噜噜| 亚洲2020天天堂在线观看| 91av在线看| 久久躁狠狠躁夜夜爽| 国产精品久久久久久久av大片| 欧美精品久久久久a| 亚洲午夜精品久久久久久性色| 亚洲国产小视频在线观看| 性欧美暴力猛交69hd| 久久久最新网址| 色综合伊人色综合网|