在实际开发中,当有少量的信息需要写入到本地时,最最常用的方法就是归档解档,这里我们只讨论对对象的归档解档。
首先说一下主要思路,DataManager是用来归档数据的类,LoginData是用来储存数据的类,下面话不多说,上代码。
1.定义储存数据的类
//遵循协议,实现两个代理方法
class LoginData: NSObject, NSCoding {
let TestAccount = "account"
let TestPassword = "password"
var account: String?
var password: String?
override init() {
super.init()
}
required init?(coder aDecoder: NSCoder) {
super.init()
account = aDecoder.decodeObjectForKey(TestAccount) as? String
password = aDecoder.decodeObjectForKey(TestPassword) as? String
}
func encodeWithCoder(aCoder: NSCoder) {
if account?.characters.count > 0 {
aCoder.encodeObject(account, forKey: TestAccount)
}
if password?.characters.count > 0 {
aCoder.encodeObject(password, forKey: TestPassword)
}
}
}
注意:这里要特别注意的是实现这两个代理方法后,类的init()构造方法就没有了,必须自己手动重写一下。
同时在init?(coder aDecoder: NSCoder)方法中也要调用一下父类的init()方法
2.定义储归档解档数据的类
class LoginManager: NSObject {
var filepath: String?
//重写currentLoginData的setting方法,以便外界调用时执行保存数据的操作
var currentLoginData: LoginData? {
didSet {
saveData()
}
}
//单例
static let sharedManager: SXLoginManager = {
//NTESFileLocationHelper是一个获取文件路径的类,也可以直接获取路径
let filePath = NTESFileLocationHelper.getAppDocumentPath().stringByAppendingString("Test_login_data")
let manager = SXLoginManager.init(filepath: filePath)
return manager
}()
//自定义构造方法用来保存文件路径
init(filepath: String) {
self.filepath = filepath
super.init()
}
//读取数据
private func readData() {
if NSFileManager.defaultManager().fileExistsAtPath(filepath!) {
let objcet = NSKeyedUnarchiver.unarchiveObjectWithFile(filepath!) as? LoginData
currentLoginData = objcet
}
}
//保存数据
private func saveData() {
var data = NSData()
if currentLoginData != nil {
data = NSKeyedArchiver.archivedDataWithRootObject(currentLoginData!)
}
data.writeToFile(filepath!, atomically: true)
}
}
3.保存数据
let loginData = LoginData()
loginData.account = self.telTextFieldValue
loginData.password = self.passwordtFieldValue
SXLoginManager.sharedManager.currentLoginData = loginData