NSKeyedArchiver一般用于对象的归档和接档. 直接上代码
模型:
注意必须遵循nscoding协议
import UIKit
import HandyJSON
class WeatherModel: NSObject,HandyJSON,NSCoding {
var city: String = ""
var week: String = ""
var air_tips: String = ""
required override init() {}
required init?(coder aDecoder: NSCoder) {
city = aDecoder.decodeObject(forKey: "city") as! String
week = aDecoder.decodeObject(forKey: "week") as! String
air_tips = aDecoder.decodeObject(forKey: "air_tips") as! String
}
func encode(with coder: NSCoder) {
coder.encode(city, forKey: "city")
coder.encode(week, forKey: "week")
coder.encode(air_tips, forKey: "air_tips")
}
}
//获取文件路径
func getDocumentsPath(path: String) -> String? {
//检索指定路径
//第一个参数指定了搜索的路径名称,NSDocumentDirectory表示是在Documents中寻找.NSCacheDirectory的话就是在cache文件中寻找.第二个参数限定了文件的检索范围只在沙箱内部.其意义为用户电脑主目录.也可以修改为网络主机等.最后一个参数决定了是否展开波浪线符号.展开后才是完整路径,这个布尔值一直为YES.
//该方法返回值为一个数组,在iphone中由于只有一个唯一路径(相对OC而言),所以直接取数组第一个元素即可.
let docPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.cachesDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last as NSString?
let filePath = docPath?.appendingPathComponent(path);
print("文件路径的地址是\(docPath ?? "")")
return filePath
}
//创建对象
let model = WeatherModel()
model.city = "重庆"
model.air_tips = "123123"
//归档
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: model, requiringSecureCoding: false)
try data.write(to: URL(fileURLWithPath: getDocumentsPath(path: "model")!))
} catch {
print(error)
}
//解档
do {
let data = try Data(contentsOf: URL(fileURLWithPath: getDocumentsPath(path: "model")!))
if let model = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? WeatherModel{
print("model===\(model)")
print("city = \(model.city)")
}
} catch {
print("unarchive failure in init")
}
打印结果.png
网友评论