IOS(swift)-數據存儲 · NSKeyedArchiver 歸檔

需求:

有一個通信列表,能夠自行添加聯繫數據,可是從新開啓後,添加的數據都會清空,我但願打開後,上一次的數據能保留。css

這咱們就必須用到數據持久化,這一次,我將用NSKeyedArchiver 歸檔 方式來作數據持久化,達到再次打開應用後,數據依然存在。ios

通信錄.png

通信錄.pngswift

NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios數據存儲上,數據從內存存儲到閃存上,這個過程稱爲歸檔。Apple官方文檔中,這些數據類型包括:
NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。很顯然,複雜數據例如UIImage,沒法直接歸檔。但咱們有一種變通的作法,先將UIImage對象轉換爲NSData,再對NSData進行歸檔。數組

1、建立一個數據模型(自定義類)
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

NScoding協議須要實現兩個方法:
func encodeWithCoder(aCoder: NSCoder)

以keyValue形式對基本數據類型Encodingui

init(coder aDecoder: NSCoder)

以keyValue形式對基本數據類型Decodingspa

2、建立一個全局路徑,即要保存到閃存的位置:
let ContactFilePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0].stringByAppendingPathComponent("contacts.data")
3、從歸檔中讀取給數組,若是第一次讀取無數據,則實例化數組

這裏要用到 解檔方法:code

NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath)
var contactArr:NSMutableArray?if(contactArr == nil){
            println("從歸檔中提取")
            contactArr = NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath) as NSMutableArray!            if(contactArr == nil){
                println("歸檔中沒有,建立數組")            self.contactArr = NSMutableArray()

            }

        }
4、保存歸檔

在全部對數組進行操做的地方進行歸檔保存orm

 NSKeyedArchiver.archiveRootObject(self.contactArr!, toFile: ContactFilePath)

歸檔這種保存方式缺點就是沒有屬性列表(NSuserDefault)速度快,由於它每次都要把文件保存到閃存中,優勢是能夠建立本身想要的數據模型對象

相關文章
相關標籤/搜索