我们平常比较常用的模型缓存一般都是通过归档解档实现的,详情请参考我之前写的一篇文章归档解档。
今天我介绍的一种新的缓存方式:模型转JSON字符串缓存
直接上代码:
import ObjectMapper
extension Mappable {
private static func cacheDirectory(isCreateFile:Bool, name:String) throws -> URL {
let url:URL = DHFileManager.documentDirectory().appendingPathComponent("\(name)_Data")
if isCreateFile && !FileManager.default.fileExists(atPath: url.path) {
let attr: [FileAttributeKey: Any] = [FileAttributeKey(rawValue: FileAttributeKey.protectionKey.rawValue): FileProtectionType.complete]
let ret = FileManager.default.createFile(atPath: url.path, contents: nil, attributes: attr)
if ret {
return url
} else {
throw NSError.init(domain: "fail", code: 10001, userInfo: ["fail" : "文件创建失败"])
}
}
return url
}
static func getCacheModel<T:Mappable>(class:T.Type) -> T? {
do {
let jsonString = try String(contentsOf: cacheDirectory(isCreateFile: false, name: "\(self)"))
return Mapper<T>().map(JSONString: jsonString) ?? nil
} catch {
return nil
}
}
func writeCacheModel() -> Bool {
do {
let modelType = type(of: self)
let url = try Self.cacheDirectory(isCreateFile: true, name: "\(modelType)")
let string = self.toJSONString() ?? ""
try string.write(to: url, atomically: true, encoding: String.Encoding.utf8)
} catch {
return false
}
return true
}
static func removeCacheModel() -> Bool {
do {
let url = try Self.cacheDirectory(isCreateFile: true, name: "\(self)")
try FileManager.default.removeItem(at: url)
} catch {
return false
}
return true
}
}
获取文件路径的方法:
class DHFileManager {
class func documentDirectory() -> URL {
let URL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
return URL
}
class func libraryDirectory() -> URL {
let URL = FileManager.default.urls(for: .libraryDirectory, in: .userDomainMask).first!
return URL
}
class func cachesDirectory() -> URL {
let URL = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask).first!
return URL
}
}
调用方法也很简单:
//注意需要缓存的model需要实现Mappable协议
let model = TestModel()
//写缓存
model.writeCacheModel()
//读缓存
let model = TestModel.getCacheModel(TestModel.self)
//清缓存
TestModel.removeCacheModel()