日常中我们通常使用UserDefaults
FMDB
FileManager
等等方式去进行本地缓存的操作.
首先来看UserDefaults的日常存取使用方式:
存: UserDefaults.standard.set(value, forKey: key)
取: let value = UserDefaults.standard.value(forKey: key)
这样的使用方式你不能说就是错误的, 但是可能你当时写这段代码的时候你还知道这是用来做什么的, 过段时间呢? 是不是还要去想 这个 key
是什么意思, 我当时为什么这么写?
由UserDefaults
推及FileManager
, FMDB
是不可能直接用的, 基本都会做一层封装. 以这个背景为前提, 为了解决垃圾代码过多, 无法统一管理等操作, 我封装了CZBDataStorge
这个库用在平常工作中使用.
CZBDataStorge
里面包含了四中缓存方式, 分别是 UserDefaults
Keychain
DB
FileManager
.
先来介绍一下 UserDefaults
的使用方式:
首先需要创建一个遵守CZBUserDefaultsProtocol
协议的枚举, 在枚举中定义要存储的值得key
. 示例如下所示:
enum UserDefaultKeys: String, CZBUserDefaultsProtocol {
case month
case day
}
存值:
CZBUserDefaults.standard[UserDefaultKeys.month] = "11月"
取值: 这里接口返回的是Any类型, 开发者自己转成确定的类型.
let month = CZBUserDefaults.standard[UserDefaultKeys.month]
我做了什么呢? 在CZBUserDefaults
内部, 我定义了它的下标方法, 得以实现通过下标的方式去存取值.
keyChain
的实现原理与CZBUserDefaults
相同.
下边我们来说一下DB
存储方式, 我这里使用的是WCDB, 用过WCDB
的人都知道, 使用它从创建表到存储对象这个过程其实并不复杂, 我做的只是把这个操作封装起来了, 开发者不需要关心创建表的问题, 只需要遵守协议, 另外实现一下TableCodable
的代理方法完成模型绑定就可以了. 下面我们来看一下使用方式:
模型Model需遵守CZBDbManagerProtocol
和TableCodable
协议, 完成模型绑定. 例如:
class SampleTest: CZBDbManagerProtocol, TableCodable {
var identifier: Int? = nil
var description: String? = nil
var offset: Int = 0
var debugDescription: String? = nil
enum CodingKeys: String, CodingTableKey {
typealias Root = SampleTest
static let objectRelationalMapping =
TableBinding(CodingKeys.self)
case identifier = "id"
case description
case offset = "db_offset"
}
}
例如你想插入一个SampleTest对象, 你不需要关注这个时候表是否创建了, 只需要使用对象方法insert()
就可以了, 如sample.insert()
. 如果你想批量插入数据, 也可以[SampleTest(), SampleTest()].insert()
. 这里还单独提供了一个insertOrReplace()
, 字面语义, 如果数据库中存在则替换, 不存在则直接插入. 另外还提供了 delete
update
get
操作. 还提供了进阶的加密
和事务
操作.
关于DB
这个操作, 我还有更多设想, 比如不需要类去遵守TableCodable
协议, 需要慢慢迭代.
FileManager
就是一个文件封装了, 没什么好介绍的.
关于上述文章都可以直接去git查看工具实现方式, 有详细的使用介绍, 另外有任何问题可以随时联系我.