正常开发
在正常开发中要使用UITableView
的话,需要设置dataSource
和delegate
,然后实现对应的协议方法。
1 | tableView.dataSource = self |
简单的例子
来个简单的例子看看Rx
中对UITableView
是怎么处理的。
老套路,新建项目,引入pod
,放个UITableView
和UITableViewCell
。
然后初始化一些数据使用Rx
绑定到UITableView
。
1 | let items = Observable.just( |
通过简短的几行代码,就把通过设置dataSource
和delegate
的事来做了。
例子官方都有,下面来看看它的原理是什么?
原理解析
1 | items |
这段代码,简单来说,是在里面创建了一个dataSource
的代理对象,然后代理对象的方法会使用传入的items
以及cell
设置。
1 | override func _tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { |
这里调用的itemModels
就是传入的items
, 调用的cellFactory
就是传入的:
1 | { (tv, i, item) in |
而这个configureCell
就是最开始的:
1 | { |
modelSelected
也是delegate
的tableView:didSelectRowAtIndexPath:
包装了下:
1 | public var itemSelected: ControlEvent<IndexPath> { |
大家还是自己看看源码理一下吧~~
RxDataSource
如果要显示多个Section
的tableview
的话,可以借助RxDataSource
帮我们完成。
新建一个项目,pod导入
1 | use_frameworks! |
这里要额外引入RxDataSources
。
首先创建一个dataSource
对象:
1 | let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Double>>() |
然后创建自定义的数据:
1 | let items = Observable.just([ |
配置cell
:
1 | dataSource.configureCell = { |
设置section
的title
:
1 | dataSource.titleForHeaderInSection = { dataSource, sectionIndex in |
把数据绑定到dataSource
:
1 | items |
点击事件:
1 | tableview.rx |
虽然RxDataSource
内部有一个代理对象,但是我们仍然可以设置delegate
。
1 | tableview.rx |
然后实现delegate
方法:
1 | extension ViewController : UITableViewDelegate{ |
这里和上面不同的是,我们主动创建了一个dataSource
传了进去。
Proxy
上面我们提到了代理对象,这个代理对象到底是什么?
我们来看看源码中的解释:
它就相当与一个中间拦截器,把原始的代码对象的方法转成一个个可被观察的序列发射出去,然后再转发给我们自定义的delegate
。所以它既不影响我们自己设置的delegate
,同时还可以以Rx
的方式去处理这些事件。
本文的例子都是以为官方为例,后面会加入通过网络请求获取Model
等操作。