美文网首页
swift-对象存储本地化

swift-对象存储本地化

作者: 热望与美梦 | 来源:发表于2018-05-18 14:41 被阅读0次

    背景:

           项目里有一些具有收藏、点赞的需求需要存储到本地的数据,并且能看到收藏列表,因此要用到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("保存到本地文件失败")

            }

        }

    }

    相关文章

      网友评论

          本文标题:swift-对象存储本地化

          本文链接:https://www.haomeiwen.com/subject/octbdftx.html