iOS 封装一个仿 RxDriver 简易 UITableView 数据源驱动绑定功能思路与实现

废话开篇:RxSwift 下的 Driver 一般用来绑定在主线程需要执行的 UI 操作,最常用的就是绑定 UITableView 的 DataSource ,那么,如此优雅代码风格也确实值得借鉴,但是 RxSwift 的代码内部高度封装,理解起来需要很大的耐心,那么,为了加深对 RxSwift Driver 的理解,封装一个简易的 OC 版。

以前文章链接

# iOS 封装一个简易 UITableView 链式监听点击事件的功能思路与实现

# iOS 简单封装 UITableView 链式监听点击事件下 Dispose 和 DisposeBag

一、实现效果预览

实现代码

image.png

实现效果

image.png

代码是不是跟 RXSwift 有点类似了,那么,这里看一下 RXSwiftDriverdrive 方法是如何定义的。

image.png

解释一下:

声明了包含了两个参数的并且返回值是 R2drive 方法;第一个参数是方法,是一个参数 Observable 类型的可观察序列,返回值是一个参数为 R1 返回值为 R2 的闭包;第二个参数数 R1

是不是有点绕?!?

那么,就按照这个思路实现一个 KDSDriver

可能这里有个疑问,为啥不说明一下 RXSwiftDriver 类的实现,可以这样理解,其实最终要实现的就是外界的可返回 UITableViewCellblock 内部下沉,传到真正 UITableViewDataSource 里面当外界条件满足(onNext)触发刷新 UI 即可。

二、KDSDriver 类的封装 KDSDriver.h

完整代码

image.png

可以看到内部实现了 drive 方法 和 onNext 方法,

1、drive 方法

方法依然采用的是返回 block 的形式,这里返回了一个 KDSDriveBlock

image.png

KDSDriveBlock 需要返回 WSLDispose 对象,它是用来对进行冗杂代码下沉过程中内部创建的临时对象销毁的,参数 obj 就是 drive 对象需要绑定的驱动对象(tableview),sel 这个方法就是 objtableview)需要执行的方法,driverTableViewDataSourceBlock 是一个 KDSDriverTableViewDataSourceBlock 类型的 block,目的也很简单,就是保存了可根据需求返回 UITableViewCellblock

2、KDSDriverTableViewDataSourceBlock

image.png

TKDSDriver 对象声明时候的泛型

声明 image.png

创建 image.png

三、KDSDriver 类的封装 KDSDriver.m

image.png

四、封装 UITableView 分类下的 rxItems:driverTableViewDataSourceBlock 方法

为了满足 KDSDriver 对象的 dirve 方法返回值 KDSDriveBlock 参数的需求,需要在 UITableView 分类下的创建一个 SEL(方法)

UITableView (KDS).h

image.png

参数解释

KDSDriver:数据驱动对象

KDSDriverTableViewDataSourceBlockUITableViewCell 回执 block

返回值解释

KDSDriveBlockResultBlock

image.png

这个类型的 Block 存在的意义就是绑定 UITableViewCell 回执 KDSDriverTableViewDataSourceBlock 到真正的 TableViewDataSource 对象上,当外界的 KDSDriver 发送 onNext 事件的时候,TableViewDataSource 在执行代理方法 tableView:cellForRowAtIndexPath: 的时候返回这个 KDSDriverTableViewDataSourceBlock 运行结果即可,并返回一个 WSLDispose 对象(用来进行销毁操作)

UITableView (KDS).m

image.png

红圈处1:

设置 UITableView 的代理

红圈处2:

初始化 UITableView 关联对象 dispose

绑定 driveonNext 事件下要执行的刷新 KDSDriverDataSourceRefreshBlockKDSTableViewDataSourceProxy 代理对象内部,触发 KDSTableViewDataSourceProxy 进行刷新 UITableView 的操作。

进行临时变量的 dispose 对象临时持有,防止提前释放。

五、封装 KDSTableViewDataSourceProxy

KDSTableViewDataSourceProxy.h

image.png

KDSTableViewDataSourceProxy.m

image.png

六、运行结果

代码实现

cell 点击事件

image.png

数据源驱动返回 cell image.png

点击正常

image.png

看看当前 UIViewController 销毁时 KDSDriver 驱动数据操作内部的创建临时并保存在 KDSDisposeBag 里的变量能不能正常销毁。

image.png

可以看到,内部创建的临时变量全部销毁了。

七、总结与思考

把外界程序员要灵活处理的代码部分以 Block 的形式定义出来,传到可操作的代理的内部,在特定的时机去触发就是本文的思路,其实 RxSwift 亦是如此实现的。所以,不必去困惑为啥写了很多代码其实就是本身一句话能解决的事

文章也仅为个人思考,代码拙劣,大神勿笑

猜你喜欢

转载自juejin.im/post/7035819263201902599
今日推荐