使用plist文件存储信息

用户添加或更改的信息用内存来存储是不合适的,因为在用户切换到其他程序的时候可能因为内存不够的原因而关闭我们的程序。

程序关闭后那些信息就丢失了。


因此将信息存在某个地方 ,当程序启动的时候将信息导入,用户修改过后再将信息继续存储则是一种好的方式。

大量的数据由于性能的要求可以存入数据库中,少量的数据存在文件中就可以了。


而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的相应函数中。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值