美文网首页
Swift模型的缓存策略

Swift模型的缓存策略

作者: 海到尽头天为岸 | 来源:发表于2017-11-01 20:14 被阅读123次

我们平常比较常用的模型缓存一般都是通过归档解档实现的,详情请参考我之前写的一篇文章归档解档
今天我介绍的一种新的缓存方式:模型转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()

相关文章

网友评论

      本文标题:Swift模型的缓存策略

      本文链接:https://www.haomeiwen.com/subject/ijogpxtx.html