IOS(swift)-数据存储 · NSKeyedArchive

作者: 俊瑶先森 | 来源:发表于2015-01-12 22:45 被阅读9005次
    需求:

    有一个通讯列表,可以自行添加联系数据,但是重新开启后,添加的数据都会清空,我希望打开后,上一次的数据能保留。

    这我们就必须用到数据持久化,这一次,我将用NSKeyedArchiver 归档 方式来做数据持久化,达到再次打开应用后,数据依然存在。

    通讯录.png

    NSKeyedArchiver、NSKeyedUnarchiver ,主要用在ios数据存储上,数据从内存存储到闪存上,这个过程称为归档。Apple官方文档中,这些数据类型包括:
    NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。很显然,复杂数据例如UIImage,无法直接归档。但我们有一种变通的做法,先将UIImage对象转换为NSData,再对NSData进行归档。

    一、创建一个数据模型(自定义类)
    import UIKit
    
    class 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协议,

    NScoding协议需要实现两个方法:
    func encodeWithCoder(aCoder: NSCoder)```
    以keyValue形式对基本数据类型Encoding
    
    

    init(coder aDecoder: NSCoder) ```
    以keyValue形式对基本数据类型Decoding

    二、创建一个全局路径,即要保存到闪存的位置:
    let ContactFilePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0].stringByAppendingPathComponent("contacts.data")```
    
    ######三、从归档中读取给数组,如果第一次读取无数据,则实例化数组
    
    这里要用到 解档方法:
    

    NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath)

    
    

    var contactArr:NSMutableArray?
    if(contactArr == nil){
    println("从归档中提取")
    contactArr = NSKeyedUnarchiver.unarchiveObjectWithFile(ContactFilePath) as NSMutableArray!
    if(contactArr == nil){
    println("归档中没有,创建数组")
    self.contactArr = NSMutableArray()

            }
       
        }
    
    ######四、保存归档
    在所有对数组进行操作的地方进行归档保存
    
    

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

    
    归档这种保存方式缺点就是没有属性列表(NSuserDefault)速度快,因为它每次都要把文件保存到闪存中,优点是可以创建自己想要的数据模型
    
    
    #####打赏专用:
    http://weibo.com/p/1001603800398153516379
    
    

    相关文章

      网友评论

      • 大米卡卡:UIImage不用转化为NSData也可以归档
      • 言溪Lee:你好 你有没有测试过iOS10下 归档失败?
      • 歌的神:楼主,可以发个demo吗
      • 张宇航_Ken:不错
        直接用swift的array和dictionary也可以

      本文标题:IOS(swift)-数据存储 · NSKeyedArchive

      本文链接:https://www.haomeiwen.com/subject/mqmqxttx.html