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

以前文章链接

# iOS 封装一个简易 UITableView 链式监听点击事情的功用思路与完成

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

一、完成作用预览

完成代码

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

完成作用

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

代码是不是跟 RXSwift 有点相似了,那么,这儿看一下 RXSwiftDriverdrive 办法是如何界说的。

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

解说一下:

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

是不是有点绕?!?

那么,就按照这个思路完成一个 KDSDriver

可能这儿有个疑问,为啥不说明一下 RXSwiftDriver 类的完成,能够这样了解,其实最终要完成的便是外界的可返回 UITableViewCellblock 内部下沉,传到真实 UITableViewDataSource 里面当外界条件满意(onNext)触发改写 UI 即可。

二、KDSDriver 类的封装 KDSDriver.h

完整代码

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

能够看到内部完成了 drive 办法 和 onNext 办法,

1、drive 办法

办法依然选用的是返回 block 的方式,这儿返回了一个 KDSDriveBlock

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

KDSDriveBlock 需求返回 WSLDispose 目标,它是用来对进行冗杂代码下沉过程中内部创立的暂时目标毁掉的,参数 obj 便是 drive 目标需求绑定的驱动目标(tableview),sel 这个办法便是 objtableview)需求履行的办法,driverTableViewDataSourceBlock 是一个 KDSDriverTableViewDataSourceBlock 类型的 block,目的也很简略,便是保存了可根据需求返回 UITableViewCellblock

2、KDSDriverTableViewDataSourceBlock

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

TKDSDriver 目标声明时分的泛型

声明

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

创立

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

三、KDSDriver 类的封装 KDSDriver.m

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

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

为了满意 KDSDriver 目标的 dirve 办法返回值 KDSDriveBlock 参数的需求,需求在 UITableView 分类下的创立一个 SEL(办法)

UITableView (KDS).h

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

参数解说

KDSDriver:数据驱动目标

KDSDriverTableViewDataSourceBlockUITableViewCell 回执 block

返回值解说

KDSDriveBlockResultBlock

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

这个类型的 Block 存在的意义便是绑定 UITableViewCell 回执 KDSDriverTableViewDataSourceBlock 到真实的 TableViewDataSource 目标上,当外界的 KDSDriver 发送 onNext 事情的时分,TableViewDataSource 在履行署理办法 tableView:cellForRowAtIndexPath: 的时分返回这个 KDSDriverTableViewDataSourceBlock 运转成果即可,并返回一个 WSLDispose 目标(用来进行毁掉操作)

UITableView (KDS).m

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

红圈处1:

设置 UITableView 的署理

红圈处2:

初始化 UITableView 关联目标 dispose

绑定 driveonNext 事情下要履行的改写 KDSDriverDataSourceRefreshBlockKDSTableViewDataSourceProxy 署理目标内部,触发 KDSTableViewDataSourceProxy 进行改写 UITableView 的操作。

进行暂时变量的 dispose 目标暂时持有,防止提前开释。

五、封装 KDSTableViewDataSourceProxy

KDSTableViewDataSourceProxy.h

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

KDSTableViewDataSourceProxy.m

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

六、运转成果

代码完成

cell 点击事情

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

数据源驱动返回 cell

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

点击正常

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

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

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

能够看到,内部创立的暂时变量全部毁掉了。

七、总结与考虑

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

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