背景:
? ? ? ?項(xiàng)目里有一些具有收藏、點(diǎn)贊的需求需要存儲到本地的數(shù)據(jù),并且能看到收藏列表勋乾,因此要用到swift的數(shù)據(jù)存儲的知識。發(fā)現(xiàn)本地化比OC要簡單很多嗡善。
模型處理
? ? ? ? 被存儲的對象要準(zhǔn)守Codable協(xié)議辑莫,這樣就能直接用JSONEncoder()和JSONDecoder()進(jìn)行編碼和解碼進(jìn)行data的轉(zhuǎn)換存入到內(nèi)存里面,這也是swift的高級之一罩引,不用像swift那樣進(jìn)行解析匹配各吨。這也是swft4.0推出的Codable,它可以自動將json數(shù)據(jù)進(jìn)行解析為準(zhǔn)守了Codable的數(shù)據(jù)模型袁铐。(我們項(xiàng)目里使用的是第三方數(shù)據(jù)解析框架ObjectMapper)绅你,下面主要介紹一下文件的操作和解析
?創(chuàng)建統(tǒng)一的管理器
根據(jù)不同的業(yè)務(wù)來創(chuàng)建對于的filePath
//
importFoundation
importRxSwift
importRxCocoa
/// 收藏車型。
/// 車型對比
?classCollectDataManager:NSObject{
? ? enumDataType {
? ? ? ? casecarModelType
? ? ? ? caseCarHistory
? ? ? ? caseCarTrimCompareType
? ? }
?? static let shared: CollectDataManager = {
? ? ? ? return CollectDataManager()
? ? }()
? ? private override init() {
? ? ? ? super.init()
? ? }
?獲取并構(gòu)建存儲地址
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!
? ? }()
讀取數(shù)據(jù)
? 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("文件不存在昭躺,讀取本地文件失敗") 無數(shù)據(jù)時(shí)提示忌锯,無必要
? ? ? ? }
? ? ? ? return cars
? ? }
保存數(shù)據(jù)
? 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("保存到本地文件失敗")
? ? ? ? }
? ? }
}