文章目录

  • 前言
    • 排查
    • 解决办法1: 直接用后台传来的 Key
    • 解决办法1: 利用 willSet
  • 参考文章

前言

最近要新搞一个项目, 然后选定了数据库用 RealmSwift, Model 和 JSON 互转用 HandyJSON
这两个合起来用( 准确来说, 只是HandyJSON本身的问题 ), 引发了一个问题, JSON 转 Model 的时候, Model 值一直不出来
后来, 经过一系列排查, 才找到问题所在( 表面问题, 没去看源码 ), 然后也算半解决状态了吧

HandyJSON 版本: 5.0.0
Swift 版本: 5.0

我目前的解决方法,有两个, 都不是很好, 不过抛转引玉, 肯定会有更好的方法的 ( 如广大网友, 有更好的方法, 可以留言 )

示例 JSON 为

{"Name":"老王"
}

先放一开始的代码

// 继承 RealmSwift 的 Object, 并且遵守 HandyJSON 协议
class XQTestModel: Object, HandyJSON {@objc dynamic var xq_name: String?func mapping(mapper: HelpingMapper) {// Name 映射为 xq_namemapper <<<self.xq_name <-- "Name"}}

很简单的代码, 就是把 Name 映射为 xq_name, 但转换时, 却为空 =_=

排查

有问题, 那肯定有解决办法. 那么, 就进入排查阶段. ( 说一下思路,不喜的, 直接跳过 )

RealmSwift 和 HandyJson 一起用的时候, 转换不了. 平常就不会, 那么, 我们从用了 RealmSwift 之后, 会有那些不一样的地方开始排查

  1. Object
    类 , 不用 RealmSwift 的 Object, 换成系统的 NSObject, 结果不行, 排除 ( 这里就可以看出, 其实跟 RealmSwift 无太大关系了 )

  2. @objc
    删除之后, 还是不行, 排除

  3. dynamic
    删除之后, 可以了. 那么可以先缩小范围在 dynamic 上

  4. mapping
    保持存有 dynamic 字段, 把 xq_name 改回和 JSON 一致 Name, 然后移除 mapping 内容.
    结果是可以的.

那么先知道了, 映射字段 和 dynamic 这两个问题所在, 就能离答案更进一步了. 起码现在知道, 单纯只是 HandyJSON 自己不支持 dynamic 和 mapping 混用. 不要错怪了 RealmSwift

最后想来想去, 就想到以下两个方法解决.( 感觉算不上解决方案 ?, 其实最好还是去看 mapping 源码, 估计是这一块出了问题 )

ps: GitHub 上也有人提了, 不过 HandyJSON 的大佬一直没去解决 ㄟ( ▔, ▔ )ㄏ

解决办法1: 直接用后台传来的 Key

如果你并不介意直接用后台传来的key, 那么就可以直接声明

@objc dynamic Name: String?

这样就算有 dynamic, 也是可以用的. 当然, 如果你愿意这样, 那么也不会来寻求答案, 那么可以看看第二种

解决办法1: 利用 willSet

代码如下

class XQTestModel: NSObject, HandyJSON {required override init() {super.init()}@objc private var Name: String?{willSet {xq_name = newValue}}@objc dynamic var xq_name: String?}

这个方法虽然有点蠢, 主要代码量太大,但是起码能解决目前的问题.

ps: 如有更好的方法, 请告诉我, 因为我也不想再用这么蠢的方法了 (╯﹏╰)

参考文章

Realm使用中碰到的问题(坑)及解决方案

HandyJSON + RealmSwift 坑相关推荐

  1. iOS swift Alamofire+HandyJSON网络框架封装

    iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...

  2. 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)

    目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...

  3. java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实

    好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...

  4. flask sqlalchemy踩坑记录

    查询 坑1: 查询不存在返回值不全是None 当使用first().one()等函数进行查询时,如果查询不存在,返回值为None 但是如果使用all().paginate()等函数进行查询是,如果返回 ...

  5. mac git使用与配置踩过的坑

    #mac git使用与配置踩过的坑 标题mac配置git ssh密钥 参考链接mac配置git ssh key go get安装失败的解决方法 go get约等于git clone+go instal ...

  6. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里

    引言    DateTime数据类型是一个复杂的问题,复杂到足以让你在编写[将日期从Web服务器返回到浏览器]简单代码时感到困惑. ASP.NET MVC 5和 Web API 2/ASP.NETCo ...

  7. (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!

    一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...

  8. java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得

    该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...

  9. Python 常见的坑汇总

    1. 列表与 * 操作 Python 中,* 操作符与 list 结合使用,实现元素复制. 复制 5 个空列表: In [1]: [[]] * 5 Out[1]: [[], [], [], [], [ ...

最新文章

  1. GDCM:读取UTF8 QtDir的测试程序
  2. 计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力
  3. Linux C语言 文件操作
  4. linux之间安全传输文件,使用SCP安全地传输文件[Linux] | MOS86
  5. 360团队 临时目录的原始文件不是360合法文件_谈谈腾讯电脑管家小团队版
  6. 【BZOJ2005】【codevs1937】能量采集,数论练习之二维公约数求和
  7. ActiveX插件的Z-Index属性无效问题解决
  8. esp8266烧录Html文件,实现内置网页控制设备!
  9. zabbix server配置文件
  10. SAP FICO面试题目+答案
  11. 推荐:Windows平台上三款提高工作效率的免费神器!
  12. JAVA实现数学函数图像
  13. 英特尔核显驱动hd630_全新CPU性能天梯图,十代英特尔与R3 3100/3300X定位讲解
  14. 泰拉瑞亚Tshock服务器权限
  15. linu安装JDK1.8
  16. STM32L051测试 (三、I2C协议设备的添加测试)
  17. bigworld源码分析(3)——dbMgr分析
  18. 【小程序从0到1】小程序常用组件一览
  19. 微信7.0版本与旧版更新对比 新版微信7.0版更新了什么
  20. 程序员公众号编辑神器-mdnice

热门文章

  1. iOS开屏广告解决方案XHLaunchAd 3.0
  2. burpsuit常用插件汇总
  3. 第07章_面向对象编程(进阶)
  4. UART UVM验证平台平台搭建总结
  5. SQL对日期的一些处理
  6. 在这个咖啡国度,咖啡店多到让星巴克发愁没生意
  7. 按钮的内容靠左边对齐
  8. 安卓应用层与底层驱动之间的调用
  9. 网络设备:理解路由器/交换机/防火墙 +堡垒机
  10. 电脑端调试钉钉H5应用