Realm.Object与NSObject的转换中swift协议妙用的体现

本文字数:3380

预计阅读时间:10分钟

概述

简单介绍一下,Realm数据库:

Realm 是一个跨平台的移动数据库引擎,于 2014 年 7 月发布,准确来说,它是专门为移动应用所设计的数据持久化解决方案之一。优点主体现在:1.跨平台 2.简单易用,并且相对于iOS中使用的SQLite 以及 Core Data 要快很多 3.可视化

在项目中由于使用到了 Realm数据库,就避免不了创建Realm数据库特有的数据库模型:基本类型为Realm.Object的模型。之后下文都将使用Realm.Object代表realm数据模型。

由于Realm.Object的特殊性,它不可跨线程使用,特有的list等基础类型,以及为了与业务关系解耦等原因,业务中不直接使用Realm.Object。所以我们给每个Realm.Object模型,创建了一个对应的业务模型下文简称为模型

如图1,我们需要在两种对应模型之间进行转换。为了减少重复的代码,就需要写一个模型转换功能。

想到要写一个模型转换功能?我们应该能想到有很多 Dictionary或者Array模型互转的框架,这些是开发中很常见的功能。这里不在赘述他们的原理,毕竟OC,swift中的转换思路和现有库,想必各位读者应该都看过或者写过不少。

简单描述一下已有框架的使用流程,如果从A类模型转换成B类模型。利用这些框架,我们想到的应该是 A类模型先转换成Dictionary或者json,然后Dictionary或者json转换成B类模型,使用已有框架基本都是这种套路。

本文章要阐述的不是如何使用这些框架,也不是单纯讲转换原理,而是采用更加swift的方式来实现转换功能。至于为什么要"多此一举"自己写转换具体有如下原因。

  1. swift转换框架大部分都是使用的OC原有Api思路来转换,换汤不换药,虽然还是有一个比较特殊的直接获取指针赋值的,但是在当时(大概两年前)又不够稳定

  2. 我们有Realm.Object这种类型的模型,它有自定义的基本类型,目前已有框架是没法直接使用来进行转换的。不过他提供了Dictionary生成Realm.Object的方法(这个方法还有待改进),可惜他没有提供Realm.Object生成Dictionary的方法

  3. 上面我提过了已有套路实现转换要分两步,能不能有方式可以直接Realm.Object模型互转?

  4. 实现转换的方式过程中少用或者尽量不用OC的原有运行时,符号类型判断,对象动态创建等,尽量使用swift官方标配protocol来做这件事

上面的原因条件都说了,那就开始准备咯。既然自己造轮子,那当然得造出适合自己的轮子。在这转换的实现过程中swift协议起到了不可或缺的作用,希望现在分享出来也不算太晚。正文开始咯~

转换之前的准备

概述中已经介绍了写这转换功能的初衷,我们要做的Realm.Object与普通业务模型转换。在此先列下写这转换时的想法:

  • 你要对Realm.Object有足够的了解,充分利用Realm.Object的已有特性

  • 转换方式尽量使用swift特性

  • 能不能直接由普通类型模型转换成Realm.Object,减少中间的Dictionary步骤?

要实现这个转换主要涉及到的具体问题

  • swift 类或结构体 Any.Type 创建对象(包括NSObject,Option,Array,Dictionary等泛型类型)

  • Realm List<T> 类型与 [T] 类型通用转换

  • RealmObject类型属性遍历(需要翻看realm源码,因为官方文档其实也没有提及,我也不带大家看源码了,有兴趣可以私我分享realm,哈哈哈)以及NSObject类型属性遍历方式

从基础代码开始

首先为了功能,我们定义协议,并写好转换方法名称。这样业务模型(需继承NSObject,实际赋值那步需要使用KVC)遵循Persistable协议后,就可以使用了

protocol Persistable {
  associatedtype ManagedObject: RealmSwift.Object
  //业务模型转RealmObject方法
  public func manag
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值