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是最常用的控件之一,动态的显示数据是一个项目的刚需,添加刷新数据和加载数据的方法。
- 1.刷新数据
这个很简单直接重新定初始化一下数据可以
@IBAction func changeMyDataSource(_ sender: Any) {
//初始化显示数组
let myOrignal = SectionModel.init(model: "first", items: ["郭佳佳","李梅梅","赵德刚","王雅琪"])
dataListArr.onNext([myOrignal])
}
- 2.加载更多数据
@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