有一個通信列表,能夠自行添加聯繫數據,可是從新開啓後,添加的數據都會清空,我但願打開後,上一次的數據能保留。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)速度快,由於它每次都要把文件保存到閃存中,優勢是能夠建立本身想要的數據模型對象