美文网首页iOS开发攻城狮的集散地
swift中数据持久化之归档解档 NSKeyedArchiver

swift中数据持久化之归档解档 NSKeyedArchiver

作者: fruit6 | 来源:发表于2018-09-20 15:38 被阅读34次

最近做了一个需求,将数据保存到沙盒中来实现数据持久化,写了一个manager,供参考:

import Foundation

class TaxiCertifyInfoManager {
    
    // MARK: - Static
    static let `dafault` = TaxiCertifyInfoManager()
    
    // MARK: - Property
    var identifyInfoModel = TaxiCertifyInfoModel()
    
    // MARK: - Life Cycle
    init() {
//        getDataFromDocument()
    }
    
    // MARK: - Pulice Func
    func save() {
        // 保存至硬盘文件
        let userNotificationSavedPath = "\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,FileManager.SearchPathDomainMask.userDomainMask,true).first!)/\(UserManager.default.cid?.md5() ?? "")/identifyInfo.data"
        NSKeyedArchiver.archiveRootObject(identifyInfoModel, toFile:userNotificationSavedPath)
    }

    ///读取数据
    func getDataFromDocument() {
        let fileManager = FileManager.default
        let localPath = "\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,FileManager.SearchPathDomainMask.userDomainMask,true).first!)/\(UserManager.default.cid?.md5() ?? "")"
        
        if !fileManager.fileExists(atPath: localPath) {
            try? fileManager.createDirectory(atPath: localPath, withIntermediateDirectories: true, attributes: nil)
        }
        let userNotificationSavedPath = "\(NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory,FileManager.SearchPathDomainMask.userDomainMask,true).first!)/\(UserManager.default.cid?.md5() ?? "")/identifyInfo.data"
        let identifyInfoM = NSKeyedUnarchiver.unarchiveObject(withFile:userNotificationSavedPath) as? TaxiCertifyInfoModel
 
        // 填充注册信息
        if identifyInfoM != nil {
            IdentityVM.default.personalInfoVM.firstName = identifyInfoM?.first_name
            IdentityVM.default.personalInfoVM.lastName = identifyInfoM?.last_name
            IdentityVM.default.personalInfoVM.gender = identifyInfoM?.gender
            IdentityVM.default.personalInfoVM.IDNumber = identifyInfoM?.id_card_no
            IdentityVM.default.personalInfoVM.firstGetDriversLicenseDate = identifyInfoM?.get_license_date
            IdentityVM.default.personalInfoVM.driversLicenseUrl = identifyInfoM?.license_img 
            
            IdentityVM.default.companyVM.cityModel?.province_name = identifyInfoM?.car_province_name
            IdentityVM.default.companyVM.cityModel?.city_name = identifyInfoM?.car_city_name
            
            IdentityVM.default.companyVM.companyModel?.id = identifyInfoM?.company_id
            IdentityVM.default.companyVM.companyModel?.name = identifyInfoM?.company_name
            
            if let str = identifyInfoM?.car_no {
                IdentityVM.default.vehicleVM.vehicleFront =  String(str.prefix(1))
                IdentityVM.default.vehicleVM.locationAbbr = String(str[str.index(str.startIndex, offsetBy: 1)])
                IdentityVM.default.vehicleVM.vehicleNumber = String(str[str.index(str.startIndex, offsetBy: 2)..<str.endIndex])
            }
            IdentityVM.default.vehicleVM.registerDate = identifyInfoM?.car_reg_date
            IdentityVM.default.vehicleVM.carOwner = identifyInfoM?.car_owner
            IdentityVM.default.vehicleVM.drivingLicenseImgUrl = identifyInfoM?.car_license_img
            IdentityVM.default.drivingPermitVM.groupPhotoImgUrl = identifyInfoM?.car_photo
            IdentityVM.default.drivingPermitVM.drivingPermitNum = identifyInfoM?.driver_permit_no
            IdentityVM.default.drivingPermitVM.serviceSupervisionImgUrl = identifyInfoM?.driver_permit_img
        } else {
            //清空
            IdentityVM.default.clear()
        }
    }
 
}

private enum Constant {
    static let certify_state = "TaxiCertifyInfo_certify_state"
    static let first_name = "TaxiCertifyInfo_first_name"
    static let last_name = "TaxiCertifyInfo_last_name"
    static let gender = "TaxiCertifyInfo_gender"
    static let id_card_no = "TaxiCertifyInfo_id_card_no"
    static let get_license_date = "TaxiCertifyInfo_get_license_date"
    static let license_img = "TaxiCertifyInfo_license_img"
    static let car_province_name = "TaxiCertifyInfo_car_province_name"
    static let car_district_id = "TaxiCertifyInfo_car_district_id"
    static let car_district_name = "TaxiCertifyInfo_car_district_name"
    static let car_city_name = "TaxiCertifyInfo_car_city_name"
    static let company_id = "TaxiCertifyInfo_company_id"
    static let company_name = "TaxiCertifyInfo_company_name"
    static let car_no = "TaxiCertifyInfo_car_no"
    static let car_reg_date = "TaxiCertifyInfo_car_reg_date"
    static let car_owner = "TaxiCertifyInfo_car_owner"
    static let car_license_img = "TaxiCertifyInfo_car_license_img"
    static let car_photo = "TaxiCertifyInfo_car_photo"
    static let driver_permit_no = "TaxiCertifyInfo_driver_permit_no"
    static let driver_permit_img = "TaxiCertifyInfo_driver_permit_img"
}

下面是model的类,其中的encode和decode是第一次在swift中写。

@objc(notification) class TaxiCertifyInfoModel : NSObject, NSCoding {
    
    var certify_state : IdentifyStatus?        // 认证状态(0-未提交审核 1-审核中 2-审核失败 3-审核通过 4-停止服务(黑名单))

    /*第一页*/
    var license_img : String? { // 驾照图片URL
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var first_name : String? { // 真实姓
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var last_name : String? { // 真实名
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var gender : Int? { // 性别(1-男 2-女)
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
   
    var id_card_no : String? {  // 身份证号
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var get_license_date : String? { // 初次领取驾照日期(yyyy-MM-dd)
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
   
    /*第二页*/
    var car_license_img: String? { // 行驶证图片URL
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    
    var car_no: String? { // 车牌号
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var car_reg_date: String? { // 车辆注册日期(yyyy-MM-dd)
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var car_owner: String? {  // 车辆所有人
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    
    /*第三页*/
    var car_province_name : String? { // 车辆所属省份
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    
    var car_district_name: String? { // 车辆所属地区
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var company_name : String? { // 出租车公司名
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var driver_permit_no:String? { // 准驾号码
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var driver_permit_img: String? { // 准驾证图片URL
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
    var car_photo: String? { // 人车合影URL
        didSet {
            TaxiCertifyInfoManager.dafault.save()
        }
    }
   
    /*暂时不用*/
    var car_district_id: Int?       // 车辆所属地区id
    var car_city_name: String?      // 车辆所属城市
    var company_id : Int?           // 出租车公司id
    

    func encode(with aCoder: NSCoder) {
        aCoder.encode(certify_state, forKey: Constant.certify_state)
        aCoder.encode(first_name, forKey: Constant.first_name)
        aCoder.encode(last_name, forKey: Constant.last_name)
        aCoder.encode(gender, forKey: Constant.gender)
        aCoder.encode(id_card_no, forKey: Constant.id_card_no)
        aCoder.encode(get_license_date, forKey: Constant.get_license_date)
        aCoder.encode(license_img, forKey: Constant.license_img)
        aCoder.encode(car_province_name, forKey: Constant.car_province_name)
        aCoder.encode(car_district_id, forKey: Constant.car_district_id)
        aCoder.encode(car_district_name, forKey: Constant.car_district_name)
        aCoder.encode(car_city_name, forKey: Constant.car_city_name)
        aCoder.encode(company_id, forKey: Constant.company_id)
        aCoder.encode(company_name, forKey: Constant.company_name)
        aCoder.encode(car_no, forKey: Constant.car_no)
        aCoder.encode(car_reg_date, forKey: Constant.car_reg_date)
        aCoder.encode(car_owner, forKey: Constant.car_owner)
        aCoder.encode(car_license_img, forKey: Constant.car_license_img)
        aCoder.encode(car_photo, forKey: Constant.car_photo)
        aCoder.encode(driver_permit_no, forKey: Constant.driver_permit_no)
        aCoder.encode(driver_permit_img, forKey: Constant.driver_permit_img)
    }
    
    override init() {
        super.init()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init()
        certify_state = aDecoder.decodeObject(forKey: Constant.certify_state) as? IdentifyStatus
        first_name = aDecoder.decodeObject(forKey: Constant.first_name) as? String
        last_name = aDecoder.decodeObject(forKey: Constant.last_name) as? String
        gender = aDecoder.decodeObject(forKey: Constant.gender) as? Int
        id_card_no = aDecoder.decodeObject(forKey: Constant.id_card_no) as? String
        get_license_date = aDecoder.decodeObject(forKey: Constant.get_license_date) as? String
        license_img = aDecoder.decodeObject(forKey: Constant.license_img) as? String
        car_province_name = aDecoder.decodeObject(forKey: Constant.car_province_name) as? String
        car_district_id = aDecoder.decodeObject(forKey: Constant.car_district_id) as? Int
        car_district_name = aDecoder.decodeObject(forKey: Constant.car_district_name) as? String
        car_city_name = aDecoder.decodeObject(forKey: Constant.car_city_name) as? String
        company_id = aDecoder.decodeObject(forKey: Constant.company_id) as? Int
        company_name = aDecoder.decodeObject(forKey: Constant.company_name) as? String
        car_no = aDecoder.decodeObject(forKey: Constant.car_no) as? String
        car_reg_date = aDecoder.decodeObject(forKey: Constant.car_reg_date) as? String
        car_owner = aDecoder.decodeObject(forKey: Constant.car_owner) as? String
        car_license_img = aDecoder.decodeObject(forKey: Constant.car_license_img) as? String
        car_photo = aDecoder.decodeObject(forKey: Constant.car_photo) as? String
        driver_permit_no = aDecoder.decodeObject(forKey: Constant.driver_permit_no) as? String
        driver_permit_img = aDecoder.decodeObject(forKey: Constant.driver_permit_img) as? String
    }
}

相关文章

网友评论

  • Fat君:如果是归档的话重复的代码有点多

本文标题:swift中数据持久化之归档解档 NSKeyedArchiver

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