基於ObjectMapper的本地快取

zzjzz9266a發表於2019-02-27

專案地址:github.com/zzjzz9266a/…

公司專案在之前是沒有將首頁資料做快取的,使用者體驗不太好,所以現在需要將首頁資料存到本地。

實現

首先考慮用 NSKeyedArchiver,但是用這需要遵守 NSCoding 協議,將模型裡的每個屬性確定型別。但我們專案用 ObjectMapper 解析json,遵循了 Mapple 協議,就已經把模型中的每個屬性都設定過對映關係了,難道還要再寫一遍?這樣無疑是在重複造輪子

後來仔細想想,json檔案無非就是 arraydictionary,只不過其本身的型別由根節點和子節點來確定,而且 NSArrayNSDictionary 是有 writeToFile 的方法的,那麼把模型轉為對應的NSArrayNSDictionary型別就行。

安裝

已經發布到 CocoaPods

pod `ObjectMapperCacheManager`
複製程式碼

使用方法

把資料存到裝置上時,key是唯一標識,與UserDefaults使用方法類似。

UserDefaults.standard.setValue(["name": "James", "age": 16], forKey: "User")
複製程式碼

UserDefaults唯一的不同之處在於存放在沙盒中的路徑:

  • UserDefaults的存放路徑為Home/Library/Preference/
  • ObjectMapperCacheManager的存放路徑為Home/Library/Caches

1. 儲存 key-value (原生字典或陣列) 型別

資料格式可以是字典或陣列:

let dict: [String: Any] = ["name": "James", "age": 16]
CacheManager.setCache(json: dict, for: "Json")

let dictArray = [[String: Any]] = [dict]
CacheManager.setCache(json: dictArray, for: "JsonArray")
複製程式碼

2. 獲取key-value型別

// 需顯式宣告型別
if let dict: [String: Any] = CacheManager.cacheJson(for: "Json") as? [String: Any]{  
  //print(dict)
}

if let array: [[String: Any]] = CacheManager.cacheJson(for: "JsonArray") as? [String: Any]{  
  //print(array)
}
複製程式碼

3. 儲存ObjectMapper型別的物件或物件陣列

儲存物件的型別需遵從ObjectMapper中的Mapple協議:

let user: User = User()
CacheManager.setCache(object: user, for: "Object")

let userList = [user]
CacheManager.setCache(array: userList, for: "ObjectArray")
複製程式碼

4. 獲取ObjectMapper型別的物件或物件陣列

// 需顯式宣告型別
if let user: User = CacheManager.cache(for: "Object") {
  //Do Something
}

if let array: [User] = CacheManager.cacheArray(for: "ObjectArray") {
  //Do Something
}

複製程式碼

相關文章