废话开篇:RxSwift 下的 Driver 一般用来绑定在主线程需要执行的 UI 操作,最常用的就是绑定 UITableView 的 DataSource ,那么,如此优雅代码风格也确实值得借鉴,但是 RxSwift 的代码内部高度封装,理解起来需要很大的耐心,那么,为了加深对 RxSwift Driver 的理解,封装一个简易的 OC 版。
以前文章链接
# iOS 封装一个简易 UITableView 链式监听点击事件的功能思路与实现
# iOS 简单封装 UITableView 链式监听点击事件下 Dispose 和 DisposeBag
一、实现效果预览
实现代码
实现效果
代码是不是跟 RXSwift 有点类似了,那么,这里看一下 RXSwift 对 Driver 的 drive 方法是如何定义的。
解释一下:
声明了包含了两个参数的并且返回值是 R2 的 drive 方法;第一个参数是方法,是一个参数 Observable 类型的可观察序列,返回值是一个参数为 R1 返回值为 R2 的闭包;第二个参数数 R1。
是不是有点绕?!?
那么,就按照这个思路实现一个 KDSDriver 类
可能这里有个疑问,为啥不说明一下 RXSwift 下 Driver 类的实现,可以这样理解,其实最终要实现的就是外界的可返回 UITableViewCell 的 block 内部下沉,传到真正 UITableViewDataSource 里面当外界条件满足(onNext)触发刷新 UI 即可。
二、KDSDriver 类的封装 KDSDriver.h
完整代码
可以看到内部实现了 drive 方法 和 onNext 方法,
1、drive 方法
方法依然采用的是返回 block 的形式,这里返回了一个 KDSDriveBlock,
KDSDriveBlock 需要返回 WSLDispose 对象,它是用来对进行冗杂代码下沉过程中内部创建的临时对象销毁的,参数 obj 就是 drive 对象需要绑定的驱动对象(tableview),sel 这个方法就是 obj(tableview)需要执行的方法,driverTableViewDataSourceBlock 是一个 KDSDriverTableViewDataSourceBlock 类型的 block,目的也很简单,就是保存了可根据需求返回 UITableViewCell 的 block。
2、KDSDriverTableViewDataSourceBlock
T 为 KDSDriver 对象声明时候的泛型
声明
创建
三、KDSDriver 类的封装 KDSDriver.m
四、封装 UITableView 分类下的 rxItems:driverTableViewDataSourceBlock 方法
为了满足 KDSDriver 对象的 dirve 方法返回值 KDSDriveBlock 参数的需求,需要在 UITableView 分类下的创建一个 SEL(方法)
UITableView (KDS).h
参数解释
KDSDriver:数据驱动对象
KDSDriverTableViewDataSourceBlock: UITableViewCell 回执 block
返回值解释
KDSDriveBlockResultBlock:
这个类型的 Block 存在的意义就是绑定 UITableViewCell 回执 KDSDriverTableViewDataSourceBlock 到真正的 TableViewDataSource 对象上,当外界的 KDSDriver 发送 onNext 事件的时候,TableViewDataSource 在执行代理方法 tableView:cellForRowAtIndexPath: 的时候返回这个 KDSDriverTableViewDataSourceBlock 运行结果即可,并返回一个 WSLDispose 对象(用来进行销毁操作)
UITableView (KDS).m
红圈处1:
设置 UITableView 的代理
红圈处2:
初始化 UITableView 关联对象 dispose;
绑定 drive 的 onNext 事件下要执行的刷新 KDSDriverDataSourceRefreshBlock 到 KDSTableViewDataSourceProxy 代理对象内部,触发 KDSTableViewDataSourceProxy 进行刷新 UITableView 的操作。
进行临时变量的 dispose 对象临时持有,防止提前释放。
五、封装 KDSTableViewDataSourceProxy
KDSTableViewDataSourceProxy.h
KDSTableViewDataSourceProxy.m
六、运行结果
代码实现
cell 点击事件
数据源驱动返回 cell
点击正常
看看当前 UIViewController 销毁时 KDSDriver 驱动数据操作内部的创建临时并保存在 KDSDisposeBag 里的变量能不能正常销毁。
可以看到,内部创建的临时变量全部销毁了。
七、总结与思考
把外界程序员要灵活处理的代码部分以 Block 的形式定义出来,传到可操作的代理的内部,在特定的时机去触发就是本文的思路,其实 RxSwift 亦是如此实现的。所以,不必去困惑为啥写了很多代码其实就是本身一句话能解决的事
文章也仅为个人思考,代码拙劣,大神勿笑