HandyJSON + RealmSwift 坑
文章目录
- 前言
- 坑
- 排查
- 解决办法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 之后, 会有那些不一样的地方开始排查
Object
类 , 不用 RealmSwift 的 Object, 换成系统的 NSObject, 结果不行, 排除 ( 这里就可以看出, 其实跟 RealmSwift 无太大关系了 )@objc
删除之后, 还是不行, 排除dynamic
删除之后, 可以了. 那么可以先缩小范围在 dynamic 上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 坑相关推荐
- iOS swift Alamofire+HandyJSON网络框架封装
iOS swift Alamofire+HandyJSON网络框架封装 我们在学习Objective_C时使用的网络框架是AFNetworking+MJExtension,而在swift中Alamof ...
- 【golang程序包推荐分享】分享亿点点golang json操作及myJsonMarshal程序包开发的踩坑经历 :)
目录[阅读时间:约5分钟] 一.概述 1.Json的作用 2.Go官方 encoding/json 包 3. golang json的主要操作 二.Json Marshal:将数据编码成json字符串 ...
- java调用clang编译的so_写Java这么久,JDK源码编译过没?编译JDK源码踩坑纪实
好奇害死羊 很多小伙伴们做Java开发,天天写Java代码,肯定离不开Java基础环境:JDK,毕竟我们写好的Java代码也是跑在JVM虚拟机上. 一般来说,我们学Java之前,第一步就是安装JDK环 ...
- flask sqlalchemy踩坑记录
查询 坑1: 查询不存在返回值不全是None 当使用first().one()等函数进行查询时,如果查询不存在,返回值为None 但是如果使用all().paginate()等函数进行查询是,如果返回 ...
- mac git使用与配置踩过的坑
#mac git使用与配置踩过的坑 标题mac配置git ssh密钥 参考链接mac配置git ssh key go get安装失败的解决方法 go get约等于git clone+go instal ...
- 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里
引言 DateTime数据类型是一个复杂的问题,复杂到足以让你在编写[将日期从Web服务器返回到浏览器]简单代码时感到困惑. ASP.NET MVC 5和 Web API 2/ASP.NETCo ...
- (转)面试必备技能:JDK动态代理给Spring事务埋下的坑!
一.场景分析 最近做项目遇到了一个很奇怪的问题,大致的业务场景是这样的:我们首先设定两个事务,事务parent和事务child,在Controller里边同时调用这两个方法,示例代码如下: 1.场景A ...
- java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
该文章出自:http://www.cnblogs.com/hucn/p/3572384.html 分析工具:http://www.blogjava.net/jjshcc/archive/2014/03 ...
- Python 常见的坑汇总
1. 列表与 * 操作 Python 中,* 操作符与 list 结合使用,实现元素复制. 复制 5 个空列表: In [1]: [[]] * 5 Out[1]: [[], [], [], [], [ ...
最新文章
- GDCM:读取UTF8 QtDir的测试程序
- 计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力
- Linux C语言 文件操作
- linux之间安全传输文件,使用SCP安全地传输文件[Linux] | MOS86
- 360团队 临时目录的原始文件不是360合法文件_谈谈腾讯电脑管家小团队版
- 【BZOJ2005】【codevs1937】能量采集,数论练习之二维公约数求和
- ActiveX插件的Z-Index属性无效问题解决
- esp8266烧录Html文件,实现内置网页控制设备!
- zabbix server配置文件
- SAP FICO面试题目+答案
- 推荐:Windows平台上三款提高工作效率的免费神器!
- JAVA实现数学函数图像
- 英特尔核显驱动hd630_全新CPU性能天梯图,十代英特尔与R3 3100/3300X定位讲解
- 泰拉瑞亚Tshock服务器权限
- linu安装JDK1.8
- STM32L051测试 (三、I2C协议设备的添加测试)
- bigworld源码分析(3)——dbMgr分析
- 【小程序从0到1】小程序常用组件一览
- 微信7.0版本与旧版更新对比 新版微信7.0版更新了什么
- 程序员公众号编辑神器-mdnice