EGOCache 源碼解析

mmp7 9年前發布 | 19K 次閱讀 EGOCache iOS開發 移動開發

今天說說一款叫 EGOCache 的開源項目,一個簡單、線程安全的基于 key-value 的緩存框架,原生支持NSString、UI/NSImage、和NSData,也支持儲存任何實現<NSCoding>協議的類,可以設定緩存過期時間,默認是 1 天;ARC、基于Block,同時支持 iOS 和 OSX 平臺。

Fast Caching for Objective-C (iPhone & Mac Compatible)

EGOCache 是 Enormego 團隊的開源作品,Enormego 在 Github 上貢獻了眾多開源項目,大家很可能用過 EGOTableViewPullRefresh ,它就是出自 Enormego 之手,可不知為何 EGOTableViewPullRefresh 在兩年前就已經停止了更新;不過不用擔心,今天本文所說的 EGOCache 還在保持著更新。

結構分析

EGOCache 保持很輕盈的體積,只有一個類,包括EGOCache.h和EGOCache.m兩個文件,和最基本的操作,也很方便我們學習。

分區

提供了一個緩存分區的概念(姑且叫分區吧),可對復雜的項目進行緩存分區,基于文件的各個分區的緩存各不受影響,一個 EGOCache 實例就對應一個分區。可以讓稍復雜的應用場景對不同的數據進行分類緩存,便于管理和統計。

建立分區

如果想要新建一個分區,可以使用initWithCacheDirectory:構造方法指定一個緩存目錄來創建一個EGOCache實例,如果分區已存在,則會直接使用。

全局分區

EGOCache 貼心地提供了一個全局 EGOcache 單例,也就是一個默認分區,方便一些簡單情況下的快速使用。調用globalCache實例方法就能獲取到一個單例實例,就是所提供的默認緩存分區。

儲存方式

EGOCache 采用磁盤儲存方式緩存所有數據,且并沒有提供內存緩存,所以如果你需要頻繁讀取某些緩存,為了加快讀取速度和磁盤開銷還是建議自己在內存中緩存一下。

上文說到分區的概念,每一個分區就對應一個EGOcache實例,同時對應一個 緩存目錄,目錄中就包含唯一一個.plist文件,這個 plist 文件中就存放了緩存文件對應的key和該項的過期時間,所以每個緩存目錄結構大致如下:

MyCache
    MyCache.plist
    _abc
    _def

過期

每緩存一個項,都可以單獨為其設定一個過期時間,那檢查這個過期時間并做刪除操作的事件是在哪里觸發的呢?

經過對源碼的翻閱,在initWithCacheDirectory:方法里,即每次初始化實例對象的時候會掃描一遍plist文件中記錄的所有已存在的緩存項,并和當前時間作比較,過期時間早于了當前時間則刪除對應緩存文件,并刪除 plist 文件中對應 key 的記錄。

線程

大量使用了基于 GCD 的異步操作,在EGOCache類的構造中為每個實例維護了 3 個 GCD 隊列:

dispatch_queue_t _cacheInfoQueue;
dispatch_queue_t _frozenCacheInfoQueue;
dispatch_queue_t _diskQueue;

從名字即可看到不同的隊列對應不同的緩存相關操作,為了互不沖突。

安裝

已加入 Cocoapods 豪華午餐,即刻享用:

pod 'EGOCache', '~> 2.1.3'

尾言

其實我在很早,幾年前就用過這個開源庫,當時被吸引的就是極為簡單的操作方法,閑逛之下看到如今還保持著活躍更新,不久前又增加了需要支持 Swift 的nonnull、__nullable關鍵字,于是便寫下一點點對此項目的一點理解。

來自:http://www.isaced.com/post-268.html

 本文由用戶 mmp7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!