美文网首页
Swift-归档解档存储自定义类型数据

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

作者: 下班不写程序 | 来源:发表于2020-04-03 15:39 被阅读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

    相关文章

      网友评论

          本文标题:Swift-归档解档存储自定义类型数据

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