博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift使用NSKeyedArchiver进行数据持久化保存的经验
阅读量:4679 次
发布时间:2019-06-09

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

iOS提供了几种数据持久化保存的方法,有NSKeyedArchiver,Property List,NSUserDefaults和CoreData。我学习下来,觉得保存应用内的诸如列表,记录这些东西,用NSKeyedArchiver是比较合适的。

它有些类似于操作系统中将文件压缩存放,而它是将对象压缩成一个文件存放在iOS设备的硬盘中。这样的话即使将应用关闭,下次开启时也能使用方法从硬盘将数据解压缩出来,供用户继续操作这些数据。

让对象可被NSKeyedArchiver存储

如果想要使用NSKeyedArchiver保存系统预设类型的方法,那不用做什么额外的工作,直接调用方法保存即可。而如果要保存自己建立的类,则需要让类继承NSObject和协议NSCoding,并补上func encodeWithCoder(aCoder: NSCoder)required init?(coder aDecoder: NSCoder)两个对象。

例如,我们建立了一个对象Person,有String类型的name和Int类型的overall两个属性,那我们可以这么写上述两个方法来让它变得可以用NSKeyedArchiver保存:

func encodeWithCoder(aCoder: NSCoder){   aCoder.encodeObject(name, forKey: "name")   aCoder.encodeObject(overall, forKey: "overall")}required init?(coder aDecoder: NSCoder) {   name = aDecoder.decodeObjectForKey("name") as! String   overall = aDecoder.decodeObjectForKey("overall") as! Int}

保存

保存时需要输入路径和压缩文件名。但是实际上路径基本是固定的,因为其他位置几乎都是不可写的。文件名包括后缀都可以随意定义。

let filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/person.dat"NSKeyedArchiver.archiveRootObject(person, toFile: filePath)

读取

读取时需要注意的是,读取出来的对象是作为NSObject类存在的,用户需要自行转为正确的类。

let filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/person.dat"if let person : Person = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? Person{   //处理}

我遇到的问题

其实抱怨这个问题就是这篇文章我主要目的。我之前做的demo在模拟器上运行毫无问题,但是插上手机在实机上测试,就保存失败了!搜索了半天资料,发现stackoverflow上有个人与我遇到了。后来经过调试,原来是我路径中没有加"/"。如果不加“/”,就变成了在应用主目录下生成一个Documentsperson.dat的文件,而不是在Documents文件夹下生成person.dat。在模拟器上,你是可以在任何文件夹下生成文件的,而实机上的权限控制就比较严格,Documentsperson.dat就会生成失败。

也是因为我选择的参考书并不靠谱(日本人藤田泰介所著的《プロの力が身につく iPhone/iPadアプリケーション開発の教科書》),因为它里面的路径就没有加“/”。作者估计模拟器跑通了就这样写上去了吧。

转载于:https://www.cnblogs.com/cecilma/p/nskeyedarchiver.html

你可能感兴趣的文章
20145228《信息安全系统设计基础》第四次实验实验报告
查看>>
201521123042 《Java程序设计》 第10周学习总结
查看>>
JQuery Easyui引入easyui-lang-zh_CN.js后出现乱码的问题解决方法
查看>>
cookie domain port
查看>>
springboot中starters 提供的常用的依赖
查看>>
第二章
查看>>
Java常用的非受检异常
查看>>
HDOJ-2054
查看>>
centos7安装eclipse
查看>>
Web:AJAX的详解
查看>>
两种比较器Comparable 和 Comparator
查看>>
S2JDBC テーブルを利用した独自仕様のid採番メソッド
查看>>
P3698 [CQOI2017]小Q的棋盘
查看>>
动态规划入门 洛谷P2409 Y的积木
查看>>
【第一季】CH04_FPGA设计Verilog基础(一)Enter a post title
查看>>
telnet不能用!!!提示:-bash: telnet: command not found
查看>>
隐式转换的一点想法
查看>>
web框架前言与学生数据库系统(附1.0源码)
查看>>
JavaScript基础
查看>>
Linux多线程服务端编程:使用muduo C++网络库
查看>>