示例:創(chuàng)建單例ArchiveTest類使用歸檔浩销、解檔管理用戶信息
存儲(chǔ)和修改自定義對(duì)象的方法
let userinfo = ArchiveTest.shareInstance.usermode ?? UserModel()
userinfo.token = "123"
userinfo.name = "hel"
ArchiveTest.shareInstance.usermode = userinfo
ArchiveTest.shareInstance.saveAccount()
讀取存儲(chǔ)的數(shù)據(jù)
print(ArchiveTest.shareInstance.usermode?.token ?? "","name",ArchiveTest.shareInstance.usermode?.name ?? "")
//123 , hel
完整代碼如下
ArchiveTest:歸解檔管理類
UserMode:自定義遵守NSCoding協(xié)議的數(shù)據(jù)模型類
class?ArchiveTest : NSObject {
? ? //單例
? ? static let shareInstance:ArchiveTest = {
? ? ? ? let?instance = ArchiveTest()
? ? ? ?//過(guò)濾文件是否不存在 ? ? ? ?
? ? ? ?let fileM = FileManager.default ? ? ? ?
? ? ? ?if fileM.fileExists(atPath: instance.filePath) { ? ? ? ? ? ?
? ? ? ? ? ? instance.loadAccount() ? ? ? ?
? ? ? ? }
? ? ? ? return?instance
? ? }()
? ? private override init() {}
? ? var?tem:UserModel?
? ? var?usermode:UserModel? {
? ? ? ? set{
? ? ? ? ? ? tem = newValue
? ? ? ? }
? ? ? ? get{
? ? ? ? ? ? return?tem
? ? ? ? }
? ? }
//懶加載存儲(chǔ)路徑
?lazy?var?filePath : String = {
? ? let?path =? NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask
? ? ? ? ,true).first!?as?NSString
? ? let?filePath = path.appendingPathComponent("test.data")
? ? return?filePath
? }()
//歸檔存儲(chǔ)
func saveAccount() {
? ? do{
? ? ? ? if?let?a = usermode{
? ? ? ? ? ?if #available(iOS 11.0, *) {
? ? ? ? ? ? ? ? let data = try NSKeyedArchiver.archivedData(withRootObject: a, requiringSecureCoding: true)
? ? ? ? ? ? ? ? try?data.write(to:URL(fileURLWithPath:filePath))
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? // Fallback on earlier versions
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? print("usermode為空")
? ? ? ? }
? ? }catch{
? ? ? ? print(error)
? ? }
?}
//解檔獲取
func loadAccount() {
? ? do{
? ? ? ? let data = try Data.init(contentsOf:URL(fileURLWithPath:filePath))
? ? ? ? let model = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? UserModel
? ? ? ? self.usermode = model
? ? }catch{
? ? ? ? print("獲取data數(shù)據(jù)失敗:\(error)")
? ? }
?}
//清除所有歸檔數(shù)據(jù)
func cleanCache() {
? ? self.usermode = UserModel()
? ? saveAccount()
?}
}
class UserModel: NSObject,NSCoding,NSSecureCoding {
? ? static var supportsSecureCoding: Bool {
? ? ? ? return true
? ? }
? ? var?token:String?
? ? var?name:String?
? ? func?encode(with coder:NSCoder) {
? ? ? ? coder.encode(token,forKey:"token")
? ? ? ? coder.encode(name,forKey:"name")
? ? }
? ? required override init() {
? ? ? ? super.init()
? ? }
? ? required init?(coder:NSCoder) {
? ? ? ? token = coder.decodeObject(forKey:"token")?as? String
? ? ? ? name = coder.decodeObject(forKey:"name")?as? String
? ? }
}