1.用户账户模型类 UserAccount.swift

///用户账户模型
class UserAccount: NSObject, NSCoding{//用户授权的唯一票据,用于调用微博的开放接口,同时也是第三方应用验证微博用户登录的唯一票据,第三方应用应该用该票据和自己应用内的用户建立唯一影射关系,来识别登录状态,不能使用本返回值里的UID字段来做登录识别。@objc var access_token: String?//access_token的生命周期,单位是秒数  TimeInterval = 0 /String?//一旦从服务器获得过期的时间,立刻计算准确的日期@objc var expires_in: TimeInterval = 0{didSet{//计算过期日期expiresDate = Date(timeIntervalSinceNow: expires_in)}}//过期日期@objc var expiresDate:Date?//授权用户的UID,本字段只是为了方便开发者,减少一次user/show接口调用而返回的,第三方应用不能用此字段作为用户登录状态的识别,只有access_token才是用户授权的唯一票据。@objc var uid: String?@objc var isRealName: Bool = false//用户昵称@objc var screen_name: String?//用户头像地址(大图),180×180像素@objc var avatar_large: String?init(dict:[String: Any]) {super.init()setValuesForKeys(dict)}override func setValue(_ value: Any?, forUndefinedKey key: String) {}//打印模型的描述信息override var description: String{let key = ["access_token", "expires_in", "expiresDate", "uid", "isRealName", "screen_name", "avatar_large"]return dictionaryWithValues(forKeys: key).description}//MARK: - "键值" 归档和解档/// 归档 - 把当前对象保存到磁盘前,将对象编码成二进制数据 - 跟网络的序列化概念很像/// - Parameter coder: 编码器func encode(with coder: NSCoder) {coder.encode(access_token, forKey: "access_token")coder.encode(expiresDate, forKey: "expiresDate")coder.encode(uid, forKey: "uid")coder.encode(screen_name, forKey: "screen_name")coder.encode(avatar_large, forKey: "avatar_large")}/// 接档 - 从磁盘加载二进制文件,转成对象时调用  - 跟网络的反序列化很像/// - Parameter coder: 解码器/// - required 当前对象///  'required' -  当前没有继承性,所有的对象只能解档出当前的类对象required init?(coder: NSCoder) {access_token = coder.decodeObject(forKey: "access_token") as? StringexpiresDate =  coder.decodeObject(forKey: "expiresDate") as? Dateuid = coder.decodeObject(forKey: "uid") as? Stringscreen_name = coder.decodeObject(forKey: "screen_name") as? Stringavatar_large =  coder.decodeObject(forKey: "avatar_large")as? String}
}// 在 extension 中只允许写 便利构造函数,不允许写指定的构造函数,
// 不能定义存储型属性,定义存储型属性,会破坏类本身的结构
extension UserAccount{
//    required init?(coder: NSCoder) {
//
//    }
}

2.测试返回数据内容 - AFN 默认的响应格式是 JSON,会直接反序列化

   func loadAccessToken(code: String, finished: @escaping requestCallBack){let urlString = "https://api.weibo.com/oauth2/access_token"let params : [String: Any] = ["client_id": appKey, "client_secret": appSecret, "grant_type":"authorization_code", "code": code, "redirect_uri": redirectUrl]//测试返回数据内容 - AFN 默认的响应格式是 JSON,会直接反序列化//如果要确认数据格式的问题//如果是 NSNumber,则没有引号,在做 KVC 指定属性类型非常重要//1>设置相应数据格式是二进制的responseSerializer = AFHTTPResponseSerializer()//2>发起网络请求post(urlString, parameters: params, headers: nil, progress: nil, success: { _, result in//将二进制数据转换成字符串let json = String(data: result as! Data, encoding: .utf8)print(json)}, failure: nil)}

3. JSON 转字典,字典转模型 调用函数

//JSON 字符串 -> 字典 -> 模型func jsonToDict(){let re = "{\"access_token\":\"2.00FdBF4*********13129a3d6Io4yB\",\"remind_in\":\"157679999\",\"expires_in\":157679999,\"uid\":\"30******31\",\"isRealName\":\"true\"}"guard let dict  = try? JSONSerialization.jsonObject(with: re.data(using: .utf8)!) else{print("转换失败")return}self.account = UserAccount(dict: dict as! [String: Any])print(self.account)}

4. 沙盒解档与归档
  4.1 声明参数

    ///用户模型var account: UserAccount?//归档文件保存路径private var accountURL: URL?{guard let documentURL = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first else {return nil}return documentURL.appendingPathComponent("account.plist")}/// 归档的保存路径 计算型属性 - 类似于有返回值的函数,调用的时候,语义更清晰/// 如果在 OC 中,可以通过只读属性 / 函数的方式实现private var accountPaths: String{let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).last!return (path as NSString).appendingPathComponent("account.plist")} 

4.2 归档保存对象

func dataToBaArchived(){//NSKeyedArchiver.archiveRootObject(account, toFile: self.accountPath)//保存对象  在实际开发中,一定要确认文件真的保存了  替代方法//执行此方法 - 会调用对象的 encode 方法guard let dataToBaArchived = try? NSKeyedArchiver.archivedData(withRootObject: account, requiringSecureCoding: false) else{print("解档数据失败")return}guard let _ =  try? dataToBaArchived.write(to: self.accountURL!) else{print("存储失败")return}}

4.3 解档读取对象

func unarchiveWithData(){// 从沙盒中解档数据,恢复当前数据 - 磁盘读写的速度最慢,不如内存读写效率高// account = NSKeyedUnarchiver.unarchiveObject(withFile: accountPath) as? UserAccountif let archiverData = try? Data(contentsOf: accountURL!),let accountData = (try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(archiverData)) as? UserAccount {account = accountData}}

JSON转模型归档与解档相关推荐

  1. runtime自动归档/解档

    原文出自:标哥的技术博客 前言 善用runtime,可以解决自动归档解档.想想以前归档是手动写的,确实太麻烦了.现在有了runtime,我们可以做到自动化了.本篇文章旨在学习如何通过runtime实现 ...

  2. 四种数据持久化方式(上) :属性列表与归档解档

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹. iOS开发中 ...

  3. 使用偏好设置、属性列表、归档解档保存数据、恢复数据

    数据持久化就是将文件保存到硬盘,以便下次运行时可以读取或永久保存.iOS提供了以下几种持久化方案: NSUserDefaults (偏好设置) property list 即Plist (属性列表) ...

  4. 数据存储之归档解档 NSKeyedArchiver NSKeyedUnarchiver

    在构建应用程序时,有一个重要的问题是如何在每次启动之间持久化数据,以便重现最后一次关闭应用前的状态.在iOS和OS X上,苹果提供了三种选择:Core Data.属性列表(Property List) ...

  5. iOS - iOS 12 之后的归档(NSKeyedArchiver)、解档(NSKeyedUnarchiver)用法

    一.iOS 12 之后旧的归档解档方法废弃了,更改为: 归档: + (nullable NSData *)archivedDataWithRootObject:(id)object requiring ...

  6. Runtime应用(三)实现NSCoding的自动归档和自动解档

    当我们需要将一个对象进行归档时,都要让该对象的类遵守NSCoding协议,再实现归档和接档方法.例如有一个Person类,该类有两个成员变量 @property (nonatomic,copy) NS ...

  7. 【iOS数据持久化】归档解档(NSKeyedArchiver/ NSKeyedUnarchiver)

    简介 归档(Archive)也称为序列化(serialization),把对象转化为字节码,以文件的形式存储在磁盘上,只要遵循了NSCoding协议的对象都可以实现归档和解档(大部分foundatio ...

  8. IOS 14.5版本之解档和归档的API学习

    IOS 14.5版本之解档和归档的API学习 第一部分 回顾一下老api的使用,将对象持久化至硬盘里面. 1.为什么我们要学习解档和归档, 有什么作用.当 plist 文件存储无法满足我们的需求的时候 ...

  9. iOS 归档 解档使用总结

    2019独角兽企业重金招聘Python工程师标准>>> 1.比较 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径:     NSUserD ...

最新文章

  1. 微信关闭html5游戏吗,5月20日起,微信将彻底关闭这个功能!
  2. 使用Visual Studio实现WinForm多语言版本实例
  3. ubuntu 16gcc g++版本降级
  4. m_pMainWnd = dlg错误解决方法
  5. (vue基础试炼_05)简单组件之间的传值
  6. linux vim 终端 行首 行尾_不会vi/vim,看这一篇足矣
  7. java 字符串 日期格式化_Java8常用日期格式化字符串日期相互转换
  8. csdn怎样注册?不想用微信
  9. 【华为2019年校园招聘】2019-5-8 软件题
  10. 计算机网络:第四章网络层课后习题及答案(精细版)
  11. 上标和下标复制大全(含0~9、字母、特殊字符)
  12. 金融贷款逾期的模型实现
  13. 水晶报表设置纸张大小
  14. 搞 AI 建模预测都在用 Python,其实入门用 SPL 也不错
  15. matlab中如何转动三维图_matlab如何画三维图
  16. php base64encode 长度,base64_encode
  17. [转] Bias-Variance Tradeoff
  18. php阿拉伯语字符串,PHP:如何检测输入字符串是否为阿拉伯语
  19. 服务器 信号超出范围,显示器上显示输入信号超出范围怎么处理
  20. 视频教程-商超收银软件排队挂单取单编程思路教程-其他

热门文章

  1. 商品识别系统Python,基于深度学习卷积神经网络
  2. 蚁群算法求解路径优化问题
  3. 虚拟聊天室(中介者模式实战)
  4. marker 头像 高德地图_手机地图导航软件高德地图1.如何下载高德地图
  5. html图片5秒后消失,如何让网页中图片等待5秒再显示_html/css_WEB-ITnose
  6. 米兰理工大学的计算机工程怎么样,米兰理工大学有哪些专业
  7. 把linux装到u盘如何分区,把Arch Linux安装到U盘上的具体教程
  8. 阿里 P10、腾讯 T4、华为 18,互联网公司职级、薪资、股权大揭秘-巴分巴秒
  9. 图像压缩编码和解码原理
  10. org 0x7c00解疑