數(shù)據(jù)持久化的方式有很多種,歸檔是其中的一種挨稿,說起數(shù)據(jù)持久化的方式,iOS 中基本有以下幾種方式:sqlite存儲(chǔ)京痢、coredata存儲(chǔ)奶甘、UserDefault存儲(chǔ)、歸檔祭椰、plist存儲(chǔ)臭家、還有就是直接寫入文件中。
其實(shí)歸檔也是將數(shù)據(jù)寫入文件中方淤,不同的是钉赁,歸檔是對(duì)于“對(duì)象”而言的,也就是我們將對(duì)象歸檔之后携茂,歸檔成一個(gè)Data的類型橄霉,然后再將其寫入文件中,提取的時(shí)候直接解歸檔就能獲得想要的對(duì)象邑蒋。
在用objective-c語言的時(shí)候,我想歸檔和解歸檔的思路都很清晰按厘,那么在swift中這種思路依然是沒有變得医吊,但是有些小細(xì)節(jié)需要我們注意一下。歸檔和解歸檔的一般思路就是:
1.遵循NSCoding協(xié)議逮京,并且實(shí)現(xiàn)兩個(gè)必須的方法
2.應(yīng)用NSKeyedArchiver歸檔一個(gè)對(duì)象
3.應(yīng)用NSUnkeyedArchiver解歸檔一個(gè)對(duì)象
用到了三個(gè)類和一個(gè)協(xié)議
1>NSCoding協(xié)議卿堂,這個(gè)協(xié)議要求我們必須實(shí)現(xiàn)兩個(gè)方法,一個(gè)是用來歸檔的-func encode(with aCoder: NSCoder) {}, 另外一個(gè)是用來解歸檔的方法required init?(coder aDecoder: NSCoder) {
super.init()
}
2>其中我們看到用到的一個(gè)類-NSCoder:這是一個(gè)專門用來歸檔對(duì)象屬性和解歸檔的類
3> 還有兩個(gè)比較重要的類
NSKeyedArchiver草描,這是一個(gè)歸檔類览绿,我們可以使用他去歸檔一個(gè)文件,我們可以用NSKeyedArchiver.archiveRootObject(self, toFile: newPath!) 這個(gè)方法直接歸檔并且存入文件穗慕,也可以open class func archivedData(withRootObject rootObject: Any) -> Data 先生成data饿敲,然后自己寫入文件,我比較喜歡第一種簡(jiǎn)單方便逛绵。
NSUnkeyedArchiver怀各,這是一個(gè)解歸檔類,可以用NSKeyedUnarchiver.unarchiveObject(withFile: newPath!)這個(gè)方法直接獲取OBject
需要注意的是:如果對(duì)象屬性中有基本類型是可選類型的在解歸檔的時(shí)候會(huì)crash术浪,告知解歸檔解出來的類型不是這個(gè)基本類型瓢对,因?yàn)樗强蛇x類型,我的解決辦法是如果能不用可選類型就不喲啊用可選類型胰苏,給一個(gè)初值就好了硕蛹,或者可以用NSNumber對(duì)象的可選類型