Swift-归档解档存储自定义类型数据

2020-04-03  本文已影响0人  下班不写程序
  1. 模型内部操作
  2. 外部存储、获取操作

1. 模型内部操作

1.1. 模型类必须继承NSObject 、NSCoding, 在swift5.0 之后还要继承NSSecureCoding 协议
1.2. 继承NSSecureCoding 需要实现supportsSecureCoding 方法, 并且必须要返回true(目前Xcode会点击fix 自动完成).
1.3. 必须实现encode、decode方法

import UIKit

class Model: NSObject, NSCoding, NSSecureCoding {
    static var supportsSecureCoding: Bool {
        return true
    }
    
    // 从object 解析回来
    required init?(coder: NSCoder) {
        super.init()
        name = coder.decodeObject(forKey: "name") as? String ?? ""
        age = coder.decodeObject(forKey: "age") as? Int ?? 0
    }

    // 编码成object
    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
        coder.encode(age, forKey: "age")
    }
   
    // 注意: 要严格的与后台传输类型相匹配, 否则得到的结果将为nil
    var name: String?
    var age: Int?
}

2. 存储操作(NSKeyedArchiver.archivedData)

        // 路径
        let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
        // 拼接路径 自动带斜杠的
        let filePath = (file as NSString).appendingPathComponent("UserAccount.archiver")
        print("用户信息路径:\(filePath)")
        // 保存
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: "要存入的自定义类型的数据", requiringSecureCoding: true)
            do {
                _ = try data.write(to: URL(fileURLWithPath: filePath))
                print("写入成功")
            } catch {
                print("data写入本地失败: \(error)")
            }
        } catch  {
            print("模型转data失败: \(error)")
        }

2. 获取操作(NSKeyedUnarchiver.unarchiveTopLevelObjectWithData)

        // 路径
        let file = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!
        // 拼接路径 自动带斜杠的
        let filePath = (file as NSString).appendingPathComponent("UserAccount.archiver")
        do {
            let data = try Data.init(contentsOf: URL(fileURLWithPath: filePath))
            // 当用户首次登陆, 直接从沙盒获取数据, 就会为nil  所以这里需要使用as?
            let model = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data) as? "已经存入的自定义类型的数据"
            return model
        } catch {
            print("获取data数据失败: \(error)")
        }

.End

上一篇下一篇

猜你喜欢

热点阅读