基于ObjectMapper的本地缓存

项目地址: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
}

复制代码

猜你喜欢

转载自juejin.im/post/5c05e527f265da613b6f8a12
今日推荐