废话开篇: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 亦是如此完成的。所以,不必去困惑为啥写了很多代码其实便是自身一句话能解决的事
文章也仅为个人考虑,代码低劣,大神勿笑