有一个通信列表,能够自行添加联系数据,可是从新开启后,添加的数据都会清空,我但愿打开后,上一次的数据能保留。css
这咱们就必须用到数据持久化,这一次,我将用NSKeyedArchiver 归档 方式来作数据持久化,达到再次打开应用后,数据依然存在。ios
通信录.pngswift
NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪存上,这个过程称为归档。Apple官方文档中,这些数据类型包括:
NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。很显然,复杂数据例如UIImage,没法直接归档。但咱们有一种变通的作法,先将UIImage对象转换为NSData,再对NSData进行归档。数组
import UIKitclass JKContactModel: NSObject,NSCoding{ var name:NSString! var phone:NSString! func encodeWithCoder(aCoder: NSCoder){ aCoder.encodeObject(self.name, forKey: "name") aCoder.encodeObject(self.phone, forKey: "phone") } required init(coder aDecoder: NSCoder) { super.init() self.name = aDecoder.decodeObjectForKey("name") as NSString! self.phone = aDecoder.decodeObjectForKey("phone") as NSString! } override init() { } }
经过以上的代码咱们能够看出,要实现对数据模型的归档,须要咱们实现NScoding协议,ide
func encodeWithCoder(aCoder: NSCoder)
以keyValue形式对基本数据类型Encodingui
init(coder aDecoder: NSCoder)
以keyValue形式对基本数据类型Decodingspa
let ContactFilePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0].stringByAppendingPathComponent("contacts.data")
这里要用到 解档方法:code
NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath)
var contactArr:NSMutableArray?if(contactArr == nil){ println("从归档中提取") contactArr = NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath) as NSMutableArray! if(contactArr == nil){ println("归档中没有,建立数组") self.contactArr = NSMutableArray() } }
在全部对数组进行操做的地方进行归档保存orm
NSKeyedArchiver.archiveRootObject(self.contactArr!, toFile: ContactFilePath)
归档这种保存方式缺点就是没有属性列表(NSuserDefault)速度快,由于它每次都要把文件保存到闪存中,优势是能够建立本身想要的数据模型对象