引
公司项目在之前是没有将首页数据做缓存的,用户体验不太好,所以现在需要将首页数据存到本地。
实现
首先考虑用 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
}
复制代码