前言:最近在刷LeetCode時(shí)碘举,遇到這樣一道題忘瓦,實(shí)現(xiàn)一個(gè)最近最少使用原則的實(shí)例, 146. LRU緩存機(jī)制引颈, ??這個(gè)耕皮,力扣146題境蜕,在我使用swift完成這道題之后,想著可以應(yīng)用到iOS項(xiàng)目中凌停,做一個(gè)用于內(nèi)存管理的實(shí)例工具出來(lái)粱年,于是便有了這個(gè)工具
實(shí)現(xiàn)原理:
工具使用雙向鏈表和哈希表結(jié)合的方式,實(shí)現(xiàn)LRU的讀取和存儲(chǔ)苦锨;并針對(duì)iOS的特性逼泣,進(jìn)行適當(dāng)?shù)姆庋b,使用時(shí)可以直接把他當(dāng)成是一個(gè)類(lèi)似數(shù)組或者字典這樣的存儲(chǔ)類(lèi)型舟舒,設(shè)置好上限閾值后拉庶,在存儲(chǔ)數(shù)量到達(dá)閾值后,會(huì)自動(dòng)清除最久未使用的內(nèi)容秃励,保證內(nèi)存的高效利用氏仗,工具使用swift封裝。
集成方式:
1. Cocoapods
pod 'AALURCache'
2. 直接下載GitHub# AALRUCache中的代碼夺鲜,將AALRUCache/AALRUCache/Classes
目錄下的兩個(gè)swift文件拖入工程使用(PS:純swift類(lèi)皆尔,OC無(wú)法使用)
使用方式:
1. 初始化實(shí)例
//AALRUCache<K: Hashable, V: Equatable>
//public init(_ capacity: Int) {
// maxCount = capacity
//}
let cache = AALRUCache<String, String>.init(20)
初始化的capacity參數(shù)為可以緩存的最大數(shù)量,初始化使用了兩個(gè)范型來(lái)做類(lèi)型約束币励,K為之后存取的鍵值類(lèi)型慷蠕,V為存取的數(shù)據(jù)類(lèi)型。
2. 使用
- 存入有三種方法
cache["key"] = "value"
cache.put("key", "value")
cache.append("key", "value")
使用[]也就是subscript方法時(shí)食呻,可以存入nil空值流炕,如果該key值下有數(shù)據(jù),數(shù)據(jù)會(huì)被刪除仅胞,總體也和字典一致每辟,已存在的key賦值會(huì)覆蓋舊值
- 取出有兩種方法
let value = cache["key"]
let value = cache.get("key")
如果該鍵值不存在,會(huì)返回nil空值
- 使用key值刪除數(shù)據(jù)有兩種方法
cache.remove("key")
cache["key"] = nil
key值不存在沒(méi)有影響
3. 擴(kuò)展
為了使功能更強(qiáng)大干旧,在封裝時(shí)渠欺,我將value的類(lèi)型設(shè)置為Equatable
,然后使用swift的高階函數(shù)椎眯,實(shí)現(xiàn)了從value獲取key值的反向操作挠将,當(dāng)然如果value不唯一,返回的是哈希表最前面的key值
func key(for value: V) -> K? {
return dic.first(where: { (set) -> Bool in
return value == set.value.val
})?.key
}
使用者完全可以把這個(gè)工具當(dāng)作一個(gè)字典來(lái)使用盅视,可以存儲(chǔ)基本數(shù)據(jù)類(lèi)型和類(lèi)實(shí)例捐名,設(shè)置好內(nèi)存數(shù)量上限之后,就會(huì)自動(dòng)使用LRU原則管理存儲(chǔ)的數(shù)據(jù)闹击,這些使用者是無(wú)感的镶蹋,非常簡(jiǎn)單好用,我們可以在很多需要?jiǎng)討B(tài)加載大數(shù)量級(jí)數(shù)據(jù)的地方使用這個(gè)工具,他可以幫我們把內(nèi)存控制在一個(gè)良好的狀態(tài)下贺归,推薦??
歡迎集成和使用淆两,聯(lián)系方式:e2shao1993@163.com