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"
}
网友评论