- 模型内部操作
- 外部存储、获取操作
1. 模型内部操作
1.1. 模型类必须继承NSObject 、NSCoding, 在swift5.0 之后还要继承NSSecureCoding 协议
1.2. 继承NSSecureCoding 需要实现supportsSecureCoding 方法, 并且必须要返回true(目前Xcode会点击fix 自动完成).
1.3. 必须实现encode、decode方法
import UIKit
class Model: NSObject, NSCoding, NSSecureCoding {
static var supportsSecureCoding: Bool {
return true
}
// 从object 解析回来
required init?(coder: NSCoder) {
super.init()
name = coder.decodeObject(forKey: "name") as? String ?? ""
age = coder.decodeObject(forKey: "age") as? Int ?? 0
}
// 编码成object
func encode(with coder: NSCoder) {
coder.encode(name, forKey: "name")
coder.encode(age, forKey: "age")
}
// 注意: 要严格的与后台传输类型相匹配, 否则得到的结果将为nil
var name: String?
var age: Int?
}
2. 存储操作(NSKeyedArchiver.archivedData
)
// 路径
let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
// 拼接路径 自动带斜杠的
let filePath = (file as NSString).appendingPathComponent("UserAccount.archiver")
print("用户信息路径:\(filePath)")
// 保存
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: "要存入的自定义类型的数据", requiringSecureCoding: true)
do {
_ = try data.write(to: URL(fileURLWithPath: filePath))
print("写入成功")
} catch {
print("data写入本地失败: \(error)")
}
} catch {
print("模型转data失败: \(error)")
}
2. 获取操作(NSKeyedUnarchiver.unarchiveTopLevelObjectWithData
)
// 路径
let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
// 拼接路径 自动带斜杠的
let filePath = (file as NSString).appendingPathComponent("UserAccount.archiver")
do {
let data = try Data.init(contentsOf: URL(fileURLWithPath: filePath))
// 当用户首次登陆, 直接从沙盒获取数据, 就会为nil 所以这里需要使用as?
let model = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? "已经存入的自定义类型的数据"
return model
} catch {
print("获取data数据失败: \(error)")
}
.End
网友评论