美文网首页iOS Developer程序员
使用RxSwift实现一个响应式的TableView

使用RxSwift实现一个响应式的TableView

作者: 151ba12c22e5 | 来源:发表于2017-01-20 15:42 被阅读3009次

    第一个swift项目马上就要结束了,第一次用rx走了不少弯路,我觉得是时候总结一波这段时间用rx的一些经验了,让大家能更好的体验响应式编程的乐趣。那这篇就用rxswift和rxDatasource来实现一个支持上拉刷新和下拉加载的响应式tableview。

    首先,我们来实现一个简单的网络层,就像我之前写过的(http://www.jianshu.com/p/1c76026c241c),把每个网络请求都封装成一个Observable(信号),并处理了异常,然后通过对这个信号的map转换成我们真正需要的数据。

    NetClinet

    接下来我们实现一个viewModel,在这个viewModel里我们需要声明几个property

    viewModel propertys

    loadData,这是一个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

    DEMO

    相关文章

      网友评论

        本文标题:使用RxSwift实现一个响应式的TableView

        本文链接:https://www.haomeiwen.com/subject/wgpfbttx.html