RxSwift刷新TableView和Rx代理的简单使用

2018-03-19  本文已影响699人  蓝色的风

前言

在使用RxSwift框架来实现tableview的数据源和代理方法,相对于原始的代理方法更加简明和直接,很多方法和实现都是在数据绑定下进行的。

接下来我们要做的就是刷新数据和代理方法的实现,有关于RXSwift实现TableView请参考我的另一篇文章----RXSwift --UITableView之初探

一. 开始准备

使用xcode 9.2
pod引入类容如下

 pod 'RxSwift'
 pod 'RxCocoa'
 pod 'RxDataSources' #显示tableview

在当前的目录中引入rx框架

import RxCocoa
import RxSwift
import RxDataSources

先说明一下RXSwift中的subject的几种类型和相应的区别

RxSwift中的subject,subject是observable和Observer之间的桥梁,一个subject既是一个obserable也是一个observe,它既可以发出事件也可以监听事件
     1.publicSubject:订阅publicSubject时,只能接收到订阅他之后发生的事件,subject.onNext()发出onNext事件,对应的还有onError()和onComplete()事件
     2.replaySubject:订阅replaySubject时,可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决于bufferSize的大小
     3.behaviorSubject:订阅behaviorSubject,可以接收到订阅之前的最后一个事件,这个在tableView中用的比较多,一般就是初始化数据显示空值

二 .下面就是定义响应的参数和实现:定义dataSource和显示的数据源

/// 定义释放类
    let disposedBag = DisposeBag()
    
    /// SectionModel<Sting,String>中string都可以修改为你自己定义的model类或者结构体
    let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String,String>>(configureCell:{
        _, tableview,indexPath,element in
        let cell = tableview.dequeueReusableCell(withIdentifier: "systemCell", for: indexPath) as UITableViewCell
        cell.textLabel?.text = "当前显示的cell" + element
        return cell
    })
    
    /*RxSwift中的subject,subject是observable和Observer之间的桥梁,一个subject既是一个obserable也是一个observe,它既可以发出事件也可以监听事件
     1.publicSubject:订阅publicSubject时,只能接收到订阅他之后发生的事件,subject.onNext()发出onNext事件,对应的还有onError()和onComplete()事件
     2.replaySubject:订阅replaySubject时,可以接收到订阅他之后的事件,但也可以接受订阅他之前发出的事件,接受几个事件取决于bufferSize的大小
     3.BehaviorSubject:订阅behaviorSubject,可以接收到订阅之前的最后一个事件,这个在tableView中用的比较多,一般就是初始化数据显示空值
     */
    ///定义一个BehaviorSubject类型的数据源
    var dataListArr = BehaviorSubject(value: [SectionModel<String,String>]())

三.开始对tableview的数据源进行初始化和数据绑定

override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "systemCell")
        //绑定数据
        dataListArr.asObserver().bind(to: myTableView.rx.items(dataSource: dataSource)).disposed(by: disposedBag)
        //初始化显示数组
        let myOrignal = SectionModel.init(model: "first", items: ["张歆艺","张美琪","张雅芝","李佳琪"])
        dataListArr.onNext([myOrignal])
    }

开始编译程序,一个简单的tableview就可以实现了


简单tableview的实现

四.修改数据源和添加新的数据到列表中

tableview是最常用的控件之一,动态的显示数据是一个项目的刚需,添加刷新数据和加载数据的方法。

@IBAction func changeMyDataSource(_ sender: Any) {
        //初始化显示数组
        let myOrignal = SectionModel.init(model: "first", items: ["郭佳佳","李梅梅","赵德刚","王雅琪"])
        dataListArr.onNext([myOrignal])
    }
@IBAction func loadMoreData(_ sender: Any) {
        //取出模型数据
        var tempArr = try! dataListArr.value()
        //模型数据添加新数据
        tempArr[0].items.append(contentsOf: ["郭佳佳","李梅梅","赵德刚","王雅琪"])
        dataListArr.onNext(tempArr)
        
    }

编译运行,显示如下


数据刷新和加载更多

五.代理数据的实现

代理的实现使用publicSubject去实现,新建文件secondViewController,定义一个publicSubject参数,定义好按钮的点击事件

let clickDelegate = PublishSubject<Int>()
@IBAction func buttonClickAction(_ sender: UIButton) {
         //先返回上一层 在发送事件  这个顺序随便修改
        self.navigationController?.popViewController(animated: true)
        clickDelegate.onNext(sender.tag)
    }
点击使用代理的视图如下: 代理视图

一个简单的代理就实现了

六.结束语

rxSwift功能强大,要研究的还有很多,再接再厉😁😁😁😁😁😁,最后附上代码地址 testDemo

上一篇下一篇

猜你喜欢

热点阅读