背景:
项目里有一些具有收藏、点赞的需求需要存储到本地的数据,并且能看到收藏列表,因此要用到swift的数据存储的知识。发现本地化比OC要简单很多。
模型处理
被存储的对象要准守Codable协议,这样就能直接用JSONEncoder()和JSONDecoder()进行编码和解码进行data的转换存入到内存里面,这也是swift的高级之一,不用像swift那样进行解析匹配。这也是swft4.0推出的Codable,它可以自动将json数据进行解析为准守了Codable的数据模型。(我们项目里使用的是第三方数据解析框架ObjectMapper),下面主要介绍一下文件的操作和解析
创建统一的管理器
根据不同的业务来创建对于的filePath
//
importFoundation
importRxSwift
importRxCocoa
/// 收藏车型。
/// 车型对比
classCollectDataManager:NSObject{
enumDataType {
casecarModelType
caseCarHistory
caseCarTrimCompareType
}
static let shared: CollectDataManager = {
return CollectDataManager()
}()
private override init() {
super.init()
}
获取并构建存储地址
FileManager类
private lazy var carModelPath:URL= {
let manager =FileManager.default
varfilePath = manager.urls(for: .documentDirectory, in: .userDomainMask).first
filePath!.appendPathComponent("carMedelInfos.archive")
return filePath!
}()
private lazy var CarTrimCompareModelPath:URL= {
let manager =FileManager.default
varfilePath = manager.urls(for: .documentDirectory, in: .userDomainMask).first
filePath!.appendPathComponent("CarTrimCompareModel.archive")
return filePath!
}()
private lazy var CarHistoryPath:URL= {
let manager =FileManager.default
varfilePath = manager.urls(for: .documentDirectory, in: .userDomainMask).first
filePath!.appendPathComponent("carModelsHistory.archive")
return filePath!
}()
读取数据
private funcreadFile(type:DataType) -> [Any] {
var path:URL? =nil
var cars:[Any] = []
if DataType.carModelType == type{
path =carModelPath
}else if DataType.CarTrimCompareType == type{
path =CarTrimCompareModelPath
}elseifDataType.CarHistory== type {
path =CarHistoryPath
}
If let dataRead = try ? Data(contentsOf:path!) {
do{
if type ==DataType.carModelType|| type ==DataType.CarHistory{
cars =try JSONDecoder().decode([CarModelInfo].self, from: dataRead)
}else if DataType.CarTrimCompareType== type {
cars =try JSONDecoder().decode([CarTrimCompareModel].self, from: dataRead)
}
}catch{
print(error)
}
}else{
// print("文件不存在,读取本地文件失败") 无数据时提示,无必要
}
return cars
}
保存数据
private func saveCarsModelInfo(cars: [CarModelInfo]) -> () {
let dataWrite =try?JSONEncoder().encode(cars)
do{
try dataWrite?.write(to:carModelPath)
}catch{
print("保存到本地文件失败")
}
}
func saveHistoryCars(cars: [CarModelInfo]) -> () {
let dataWrite =try?JSONEncoder().encode(cars)
do{
try dataWrite?.write(to:CarHistoryPath)
}catch{
print("保存到本地文件失败")
}
}
func saveCarCompareTrimList(cars: [CarTrimCompareModel]) -> () {
let dataWrite =try?JSONEncoder().encode(cars)
do{
try dataWrite?.write(to:CarTrimCompareModelPath)
}catch{
print("保存到本地文件失败")
}
}
}