Swift 모델의 캐시 정책

2829 단어
우리가 평소에 비교적 자주 사용하는 모델 캐시는 일반적으로 압축 파일 해제를 통해 이루어진다. 상세한 내용은 내가 전에 쓴 문장 압축 파일 해제를 참고하십시오.오늘 내가 소개한 새로운 캐시 방식: 모델이 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(class:T.Type) -> T? {
        do {
            let jsonString = try String(contentsOf: cacheDirectory(isCreateFile: false, name: "\(self)"))
            return Mapper().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()

좋은 웹페이지 즐겨찾기