你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> Objective-C的緩存框架EGOCache在iOS App開辟中的應用

Objective-C的緩存框架EGOCache在iOS App開辟中的應用

編輯:IOS開發綜合

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為何要供給設定緩存過時時光呢?或許說設定緩存過時時光有甚麼利益呢?我認為最年夜的利益就是可以准時消除緩存。可以設置某一項的緩存時光,很便利治理緩存。

那末成績來了:

  • EGOCache是怎樣檢測緩存過時時光的呢?
  • 檢測到時光過時以後,甚麼時刻觸發刪除緩存項的?

帶著這兩個成績,我們來持續剖析。

你會怎樣完成

記得在公司裡,老板常常會舉如許的例子:

某某同志,剛來我們公司的時刻,碰到成績就曉得埋怨。歷來不曉得去思慮怎樣處理,只曉得把成績拋給引導。任務半年上去,生長了許多。如今碰著成績,不只把成績拋出來,並且還供給了本身的處理計劃...
相似的例子,信任年夜家都聽過。異樣,既然後面我們提出這兩個成績,我們也先來思慮一下,假如我們來做該怎樣處理?

假如讓我來寫的話,我腦海裡初步完成辦法有幾個:

  • 經由過程准時器來輪詢,每隔一段時光檢測一次。
  • 寫一個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檢測緩存時光過時的思緒值得進修,今後碰到相似場景,完整可以自創。

【Objective-C的緩存框架EGOCache在iOS App開辟中的應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved