引
公司專案在之前是沒有將首頁資料做快取的,使用者體驗不太好,所以現在需要將首頁資料存到本地。
實現
首先考慮用 NSKeyedArchiver
,但是用這需要遵守 NSCoding
協議,將模型裡的每個屬性確定型別。但我們專案用 ObjectMapper
解析json,遵循了 Mapple
協議,就已經把模型中的每個屬性都設定過對映關係了,難道還要再寫一遍?這樣無疑是在重複造輪子
後來仔細想想,json檔案無非就是 array
和 dictionary
,只不過其本身的型別由根節點和子節點來確定,而且 NSArray
和 NSDictionary
是有 writeToFile
的方法的,那麼把模型轉為對應的NSArray
和NSDictionary
型別就行。
安裝
已經發布到 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
}
複製程式碼