通过NSArchiver保存应用数据

iOS应用有很多保存数据的方式,一般应用的配置可以采用info.plist的方式保存,重量级的数据用sqllite的方式,用NSArchiver则是一个折衷的方法。

NSArchiver实际是以二进制文件的方式,保存用户的数据。即先将用户的数据(例如对象、数组等)转化成二进制流,然后(归档)保存到文件中,相反的过程就是从文件中读取二进制流数据,(解码)恢复到对应的用户变量中。

这里涉及两个知识点:设置文件和二机制归档以解码。

设置文件

iOS的文件一般在应用的沙盒SandBox目录下,定义的方式如下:

let documentsDirectories = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let documentDirectory = documentsDirectories.first!
storageArchieveURL = documentDirectory.appendingPathComponent("\storage.dat")

这样就返回一个全路径的文件名,后续可以使用该文件名保存和读取数据。

二进制归档

需要保存的数据必须符合NSCoding协议,为保险起见,最好继承NSObject(虽然不知道有什么用),这样iOS可以进行归档。这种归档操作是层级递进的,例如一个数组可以归档,则该数组的元素的类型必须符合NSCoding协议,如果这些元素是对象,那么该对象的各个属性的类型也必须符合NSCoding协议,以此类推...

#保存数据
do {
    let data = try NSKeyedArchiver.archivedData(withRootObject: someData, requiringSecureCoding: false)
    try data.write(to: storageArchieveURL)
            //保存成功
    } catch {
           //保存失败
   }
}
#读取数据
do {
    let data = try Data(contentsOf: storageArchieveURL)
    if let retrieveData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as?  TypeOfSomeData {
    #解码成功
    } else {
    #解码失败
}
catch {
    #读数据失败
}

期间遇到一个问题,如果是枚举类型enum,则无法设置为符合NSCoding协议,解决方法就是定义的enum类型原始值类型符合NSCoding,例如String或者Int。

enum SomeEnumType: String {
  case VALUE1 = "数值1"
  case VALUE2 = "数值2"
  case VALUE3 = "数值3"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容