使用RxSwift实现一个响应式的TableView
第一个swift项目马上就要结束了,第一次用rx走了不少弯路,我觉得是时候总结一波这段时间用rx的一些经验了,让大家能更好的体验响应式编程的乐趣。那这篇就用rxswift和rxDatasource来实现一个支持上拉刷新和下拉加载的响应式tableview。
首先,我们来实现一个简单的网络层,就像我之前写过的(http://www.jianshu.com/p/1c76026c241c),把每个网络请求都封装成一个Observable(信号),并处理了异常,然后通过对这个信号的map转换成我们真正需要的数据。
NetClinet接下来我们实现一个viewModel,在这个viewModel里我们需要声明几个property
viewModel propertysloadData,这是一个PublishSubject类型,在CSDN上找了一段对Subject的解释,Subject在ReactiveX是作为observer和observerable的一个bridge或者proxy。因为它是一个观察者,所以它可以订阅一个或多个可观察对象,同时因为他是一个可观测对象,所以它可以传递和释放它观测到的数据对象,并且能释放新的对象。
page,记录当前请求的页码
dataSource,数据源数组
result,数据源信号,在controller中会把它与tableview绑定,实现响应式的关键
refresh,下拉刷新与下拉加载的状态,这里是一个Variable类型,监听数据变化的作用,当然这个地方用Subject也没有任何问题。
ok,接下来我们就把这一堆东西串起来,首先需要把loadData产生的信号转换成网络请求的信号,但这样还不能达到我们的需求,因为result需要的是一个Observable<[SectionModel]>,没关系,我们把网络请求的信号map一下就好了,至于这个SectionModel是啥东西,大家回头看看Demo就会懂了都是RxDatasource实现好的东西,当然也可以遵循SectionModelType等一些协议来自己定义一个model,总之接下来我们就需要把TopicModel装进SectionModel就好了。与同时我们还需要修改一波refresh的值,以便controller可以订阅到请求的状态。需要注意的是,如果请求失败我们需要把page--,以保证下次请求时不会跳页。
viewModel init最后,我们在controller里初始化一个viewModel,把result与tableview绑定起来,并且订阅refresh。
controller来看下我们的成果吧,一个响应式的tableview,支持下拉刷新上拉加载,不用声明delegate和DataSource。so goooood