博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS(swift)-数据存储 · NSKeyedArchiver 归档
阅读量:5977 次
发布时间:2019-06-20

本文共 1905 字,大约阅读时间需要 6 分钟。

  hot3.png

需求:

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

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

通讯录.png

通讯录.png

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协议,

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)速度快,因为它每次都要把文件保存到闪存中,优点是可以创建自己想要的数据模型

转载于:https://my.oschina.net/SoulJa/blog/524270

你可能感兴趣的文章
expdp 详解及实例
查看>>
通过IP判断登录地址
查看>>
深入浅出JavaScript (五) 详解Document.write()方法
查看>>
Beta冲刺——day6
查看>>
在一个程序中调用另一个程序并且传输数据到选择屏幕执行这个程序
查看>>
代码生成工具Database2Sharp中增加视图的代码生成以及主从表界面生成功能
查看>>
关于在VS2005中编写DLL遇到 C4251 警告的解决办法
查看>>
提高信息安全意识对网络勒索病毒说不
查看>>
我的友情链接
查看>>
IDE---Python IDE之Eric5在window下的安装
查看>>
Mybatis调用Oracle中的存储过程和function
查看>>
基本安装lnmp环境
查看>>
yum源资料汇总
查看>>
7、MTC与MTV,http请求介绍
查看>>
logstash消费阿里云kafka消息
查看>>
unix 环境高级编程
查看>>
MAXIMO 快速查找实现
查看>>
Oracle——条件控制语句
查看>>
day-6 and day-7:面向对象
查看>>
CSU Double Shortest Paths 湖南省第十届省赛
查看>>