用户添加或更改的信息用内存来存储是不合适的,因为在用户切换到其他程序的时候可能因为内存不够的原因而关闭我们的程序。
程序关闭后那些信息就丢失了。
因此将信息存在某个地方 ,当程序启动的时候将信息导入,用户修改过后再将信息继续存储则是一种好的方式。
大量的数据由于性能的要求可以存入数据库中,少量的数据存在文件中就可以了。
而iOS则提供了plist这种文件形式来存储少量的信息。使用plist文件存储信息的步骤如下:
1. 在存储之前要先要找到存储文件的位置,参考To-do list项目的程序
func documentsDirectory() -> String {
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as! [String]
return paths[0]
}
func dataFilePath() -> String {
return documentsDirectory().stringByAppendingPathComponent("Checklists.plist")
}
2.实现数据的序列化和读写文件
由于使用的tableview,我的数据源是一个数组
var items: [ChecklistItem]
将信息写入文件时需要进行编码
func saveChecklistItems() {
let data = NSMutableData()
let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
archiver.encodeObject(items, forKey: "ChecklistItems")
archiver.finishEncoding()
data.writeToFile(dataFilePath(), atomically: true)
}
此过程将数组以键值为ChecklistItems进行编码,写入文件
相反要以这个值为键取出数据
func loadChecklistItems() {
let path = dataFilePath()
if NSFileManager.defaultManager().fileExistsAtPath(path) {
if let data = NSData(contentsOfFile: path) {
let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
items = unarchiver.decodeObjectForKey("ChecklistItems") as! [ChecklistItem]
unarchiver.finishDecoding()
}
}
}
在对一个数组进行编码时,对数组中的每一个对象都要进行编码,此时这个类需要实现 NSCoding协议,包括类对象的编码和解码方式。
class ChecklistItem: NSObject, NSCoding {
var text = ""
var checked = false
func toggleChecked() {
checked = !checked
}
override init() {
super.init()
}
required init(coder aDecoder: NSCoder) {
text = aDecoder.decodeObjectForKey("Text") as! String
checked = aDecoder.decodeBoolForKey("Checked")
super.init()
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(text, forKey: "Text")
aCoder.encodeBool(checked, forKey: "Checked")
}
}
由于类具有text 和 checked属性,在对象进行编码时需要存储这两个属性,于是在下面的编码中分别以“Text”和“Checked”为键值进行存储
并且可以看出bool类型的方式和其他类型的方式不同。
3.在类对象的初始化函数中,进行数据的导入
var items: [ChecklistItem]
required init(coder aDecoder: NSCoder) {
items = [ChecklistItem]()
super.init(coder: aDecoder)
loadChecklistItems()
}
在运行loadChecklistItems()函数后,items属性从文件中获得数据。
4.在任何更改信息的过程中运行saveChecklistItems()函数进行数据的保存。
更好的方法就是在程序将要悬挂或者将要结束的时候执行,进行数据的保存,可以将保存的函数写在APP delegate的相应函数中。