欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2016年05月06日 09:21:14   作者:李剛  
這篇文章主要介紹了Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用,重點(diǎn)講解了EGOCache對(duì)緩存過期時(shí)間的檢測(cè)及處理,需要的朋友可以參考下

EGOCache簡(jiǎn)介

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.
翻譯過來(lái)就是:EGOCache一個(gè)簡(jiǎn)單、線程安全的基于 key-value 的緩存框架,原生支持NSString、UI/NSImage、和NSData,也支持儲(chǔ)存任何實(shí)現(xiàn)協(xié)議的類,可以設(shè)定緩存過期時(shí)間,默認(rèn)是1天。

EGOCache只有一個(gè)類,EGOCache.h和EGOCache.m兩個(gè)文件。用法也比較容易掌握,仔細(xì)研究一下EGOCache.h的方法,很快就可以上手。

EGOCache只提供了磁盤緩存,沒有提供內(nèi)存緩存。同時(shí),也提供了清理緩存的方法:

復(fù)制代碼 代碼如下:

- (void)clearCache;

EGOCache還提供了判斷緩存是否存在的方法:
復(fù)制代碼 代碼如下:

- (BOOL)hasCacheForKey:(NSString* __nonnull)key;

通過Cocoapods直接加入項(xiàng)目

直接在你的項(xiàng)目的Podfile加入下面一行:

復(fù)制代碼 代碼如下:

pod 'EGOCache'

然后執(zhí)行:
復(fù)制代碼 代碼如下:

$ pod update

EGOCache用法

用EGOCache緩存NSString

存儲(chǔ):

復(fù)制代碼 代碼如下:

NSString *saveString = @"把我保存起來(lái)吧";
[[EGOCache globalCache] setString:saveString forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[saveString hash]] withTimeoutInterval:24*60*60];

讀?。?br />
復(fù)制代碼 代碼如下:

NSString *getSaveString = [[EGOCache globalCache] stringForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveString" hash]]];

是不是感覺跟NSDictionary很相似,確實(shí),前面我們說(shuō)了EGOCache是基于key-value 的緩存框架。

用EGOCache緩存UIImage

存儲(chǔ):

復(fù)制代碼 代碼如下:

 UIImage *saveImage = [UIImage imageNamed:@"iOSDevTip"];
[[EGOCache globalCache] setImage:saveImage forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveImage" hash]] withTimeoutInterval:24*60*60];

讀取:
復(fù)制代碼 代碼如下:

UIImage *getSaveImage = [[EGOCache globalCache] imageForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveImage" hash]]];

用EGOCache緩存NSData

存儲(chǔ):

復(fù)制代碼 代碼如下:

NSData *saveData = [NSData data];
[[EGOCache globalCache] setData:saveData forKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveData" hash]] withTimeoutInterval:24*60*60];

讀?。?br />
復(fù)制代碼 代碼如下:

UIImage *getSaveData = [[EGOCache globalCache] dataForKey:[NSString stringWithFormat:@"EGOImageLoader-%lu", (unsigned long)[@"SaveData" hash]]];

EGOCache如何檢測(cè)緩存時(shí)間過期
EGOCache可以設(shè)定緩存過期時(shí)間,默認(rèn)是1天。查看了一下EGOCache源碼,設(shè)置默認(rèn)時(shí)間:

復(fù)制代碼 代碼如下:

    [self setDefaultTimeoutInterval:86400];
    //86400 = 24 * 60 * 60 剛好是一天時(shí)間。

EGOCache為什么要提供設(shè)定緩存過期時(shí)間呢?或者說(shuō)設(shè)定緩存過期時(shí)間有什么好處呢?我覺得最大的好處就是可以定時(shí)清除緩存??梢栽O(shè)置某一項(xiàng)的緩存時(shí)間,很方便管理緩存。

那么問題來(lái)了:

  • EGOCache是怎么檢測(cè)緩存過期時(shí)間的呢?
  • 檢測(cè)到時(shí)間過期之后,什么時(shí)候觸發(fā)刪除緩存項(xiàng)的?

帶著這兩個(gè)問題,我們來(lái)繼續(xù)分析。

你會(huì)怎么實(shí)現(xiàn)

記得在公司里,老板經(jīng)常會(huì)舉這樣的例子:

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

如果讓我來(lái)寫的話,我腦海里初步實(shí)現(xiàn)方法有幾個(gè):

  • 通過定時(shí)器來(lái)輪詢,每隔一段時(shí)間檢測(cè)一次。
  • 寫一個(gè)while循環(huán)來(lái)檢測(cè)。
  • 每次去讀取緩存項(xiàng)的時(shí)候,判斷緩存時(shí)間有沒有過期。沒過期,就返回讀取的緩存項(xiàng);否則,返回nil。
  • 當(dāng)然,還有一些方法,不一一例舉了。仔細(xì)想想,這些方法弊端很容易顯露出來(lái)。

為了小小的緩存時(shí)間,就用定時(shí)器輪詢,顯然是資源浪費(fèi)
跟方法1差不多。
每次讀取的時(shí)候判斷是否過期,如果一直不讀取,app的緩存會(huì)越來(lái)越大,也不可取。
這些方法都被排除了,還有好的方法嗎?繼續(xù)往下看:

EGOCache是怎么實(shí)現(xiàn)的?

仔細(xì)查看EGOCache源碼,發(fā)現(xiàn)在initWithCacheDirectory:方法里,每次初始化EGOCache實(shí)例對(duì)象的時(shí),會(huì)遍歷一遍plist文件中所有已存在的緩存項(xiàng),拿每個(gè)緩存項(xiàng)的時(shí)間和當(dāng)前時(shí)間作比較,緩存項(xiàng)過期時(shí)間早于當(dāng)前時(shí)間,則刪除對(duì)應(yīng)緩存文件,并刪除 plist 文件中對(duì)應(yīng) key 的記錄。

具體實(shí)現(xiàn)代碼如下:

讀取緩存項(xiàng)信息

復(fù)制代碼 代碼如下:

_cacheInfo = [[NSDictionary dictionaryWithContentsOfFile:cachePathForKey(_directory, @"EGOCache.plist")] mutableCopy];
if(!_cacheInfo) {
    _cacheInfo = [[NSMutableDictionary alloc] init];
}

獲取當(dāng)前時(shí)間的NSTimeInterval
復(fù)制代碼 代碼如下:

NSTimeInterval now = [[NSDate date] timeIntervalSinceReferenceDate];

聲明removedKeys保存過期的緩存項(xiàng)對(duì)應(yīng)的key
復(fù)制代碼 代碼如下:

NSMutableArray* removedKeys = [[NSMutableArray alloc] init];

遍歷緩存項(xiàng)信息并判斷緩存時(shí)間
復(fù)制代碼 代碼如下:

for(NSString* key in _cacheInfo) {
    //判斷緩存項(xiàng)過期時(shí)間是否早于當(dāng)前時(shí)間
    if([_cacheInfo[key] timeIntervalSinceReferenceDate] <= now) {
        //如果緩存項(xiàng)過期時(shí)間早于當(dāng)前時(shí)間,移除緩存項(xiàng)
        [[NSFileManager defaultManager] removeItemAtPath:cachePathForKey(_directory, key) error:NULL];
        //把過期的緩存項(xiàng)對(duì)于的key保存到removedKeys里面
        [removedKeys addObject:key];
    }
}

刪除過期緩存項(xiàng)對(duì)于的key
復(fù)制代碼 代碼如下:

[_cacheInfo removeObjectsForKeys:removedKeys];

看到這些,是不是覺得人家思路特牛叉,反正,我是覺得這個(gè)作者不簡(jiǎn)單。到這一步就解決了嗎?

EGOCache還做了什么?

細(xì)心的童鞋會(huì)發(fā)現(xiàn):EGOCache是個(gè)單列類,也就是說(shuō)整個(gè)程序應(yīng)用周期只初始化一次。

復(fù)制代碼 代碼如下:

+ (instancetype)globalCache {
    static id instance;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[[self class] alloc] init];
    });
    return instance;
}


每次初始化的時(shí)候去判斷了緩存項(xiàng)是否過期,這樣做非常正確。思考一個(gè)場(chǎng)景:

用戶打開app,EGOCache被初始化,并判斷了緩存項(xiàng)是否過期。
如果剛好有一些緩存項(xiàng)在EGOCache被初始化之后過期。這個(gè)時(shí)候我們依然可以讀到這個(gè)緩存項(xiàng)。這就不對(duì)了。
繼續(xù)分析EGOCache源碼發(fā)現(xiàn),EGOCache在讀取一個(gè)緩存項(xiàng)的時(shí)候,先判斷緩存項(xiàng)是否存在,然后讀取緩存項(xiàng)(注意:是讀取EGOCache初始化的時(shí)候沒有過期的緩存項(xiàng),并沒有說(shuō)現(xiàn)在沒有過期),最后去判斷讀取到的緩存項(xiàng)跟當(dāng)前時(shí)間相比是否過期.

具體實(shí)現(xiàn)如下:

復(fù)制代碼 代碼如下:

- (BOOL)hasCacheForKey:(NSString*)key {
    //讀取EGOCache初始化的時(shí)候沒有過期的緩存項(xiàng)
    NSDate* date = [self dateForKey:key];
    if(date == nil) return NO;
    //判斷讀取到的緩存項(xiàng)當(dāng)前是否過期
    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檢測(cè)緩存時(shí)間過期的思路值得學(xué)習(xí),以后遇到類似場(chǎng)景,完全可以借鑒。

相關(guān)文章

  • iOS開發(fā)一個(gè)好看的ActionSheet

    iOS開發(fā)一個(gè)好看的ActionSheet

    本篇文章通過代碼分享和圖文形式教給大家用IOS寫一個(gè)好看的ActionSheet過程以及注意事項(xiàng),需要的朋友參考下吧。
    2018-01-01
  • IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用詳解

    IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用詳解

    這篇文章主要介紹了IOS網(wǎng)絡(luò)請(qǐng)求之NSURLSession使用詳解,今天使用NSURLConnection分別實(shí)現(xiàn)了get、post、表單提交、文件上傳、文件下載,有興趣的可以了解一下。
    2017-02-02
  • iOS撥打電話的3種實(shí)現(xiàn)方式

    iOS撥打電話的3種實(shí)現(xiàn)方式

    這篇文章主要介紹了iOS撥打電話的3種實(shí)現(xiàn)方式 ,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼

    iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼

    這篇文章主要介紹了iOS整個(gè)APP實(shí)現(xiàn)灰色主題的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • iOS實(shí)現(xiàn)卡片堆疊效果

    iOS實(shí)現(xiàn)卡片堆疊效果

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)卡片堆疊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • iOS中日志同步獲取NSLog重定向以及其他詳解

    iOS中日志同步獲取NSLog重定向以及其他詳解

    在Objective-c開發(fā)程序的時(shí)候,有專門的日志操作類NSLog,它將指定的輸出,輸出到(stderr),我們可以利用Xcode的日志輸出窗口,下面這篇文章主要給大家介紹了關(guān)于iOS中日志同步獲取NSLog重定向以及其他的相關(guān)資料,需要的朋友可以參考下。
    2017-12-12
  • 詳解Swift 之clipped是什么如何用

    詳解Swift 之clipped是什么如何用

    這篇文章主要介紹了詳解Swift 之clipped是什么如何用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • iOS開發(fā)中#import、#include和@class的區(qū)別解析

    iOS開發(fā)中#import、#include和@class的區(qū)別解析

    這篇文章主要介紹了iOS開發(fā)中#import、#include和@class的區(qū)別解析,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • iOS 實(shí)現(xiàn)簡(jiǎn)單的加載等待動(dòng)畫示例(思路與實(shí)現(xiàn))

    iOS 實(shí)現(xiàn)簡(jiǎn)單的加載等待動(dòng)畫示例(思路與實(shí)現(xiàn))

    本篇文章主要介紹了iOS 實(shí)現(xiàn)簡(jiǎn)單的加載等待動(dòng)畫示例(思路與實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-05-05
  • ios可拖動(dòng)按鈕實(shí)例

    ios可拖動(dòng)按鈕實(shí)例

    下面小編就為大家分享一篇ios可拖動(dòng)按鈕實(shí)例。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-03-03

最新評(píng)論