RxSwift介绍(一)——RxSwift初探
2018-07-16 本文已影响25人
我只不过是出来写写代码
之前介绍了RAC在Objective-C环境下RACSignal信号订阅使用流程、宏定义以及各种信号的操作使用。作为函数式响应编程的代表,就不得不提RxSwift。
在swift环境下,RAC的孪生兄弟RxSwift同样提供了相同的框架使用,并且基于swift语言的优点,RxSwift甚至能够更简洁地开发业务代码。关于RxSwift的优点,大把大把的人在夸。我自己的感受是,虽然学习曲线比较陡峭,学习成本很高,一旦掌握了其开发技巧,收获要比想象中多,值得去学习并实践的框架。
接下来先看一个最常用的例子,swift环境中搭建一个简单的tableView。这里往往需要遵循TableView相关的各种代理方法,下面是使用结构体生成一串简单的数组并放入tableView中显示内容。
//使用结构体生成tableView的数据源
struct DemoModel {
var firstKey:String
var secondKey:Int
init(firstKey:String, secondKey:Int) {
self.firstKey = firstKey
self.secondKey = secondKey
}
}
struct DemoViewModel {
let infoAry = [DemoModel(firstKey: "1-1", secondKey: 1),
DemoModel(firstKey: "1-2", secondKey: 2),
DemoModel(firstKey: "1-3", secondKey: 3),
DemoModel(firstKey: "1-4", secondKey: 4)]
}
生成好了数据之后初始化,再来看看tableView的代码实现

遵循的tableView代理方法还是一如既往的繁多
接下来,在使用RxSwift框架下改造上面的tableView,来感受下RxSwift的强大。
首先引入RxCocoa与RxSwift。在RxSwift中,不再需要去挨个遵循tableView的各种代理方法,直接上修改后的代码
class ViewController: UIViewController {
lazy var firstTableView: UITableView = UITableView()
let resuerId:String = "firstCell"
let viewModel = DemoViewModel()
let disposeBag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
createTableView()
bindViewModel()
}
}
extension ViewController{
func createTableView() -> Void {
view.addSubview(firstTableView)
firstTableView.frame = view.bounds;
firstTableView.backgroundColor = UIColor.orange
firstTableView.register(UITableViewCell.self, forCellReuseIdentifier: resuerId)
}
func bindViewModel() -> Void {
//此方法将viewModel与tableView进行绑定
viewModel.infoAry.bind(to: firstTableView.rx.items(cellIdentifier:resuerId)){
row,model,cell in
//cell的具体显示内容可在此处自定义
cell.textLabel?.text = "firstKey \(model.firstKey), secondKey \(model.secondKey), row = \(row)"
}.disposed(by: disposeBag)
//点击cell的响应事件
firstTableView.rx.modelSelected(DemoModel.self).subscribe(onNext: { (model) in
print("select \(model.firstKey)")
}).disposed(by: disposeBag)
}
}
struct DemoModel {
var firstKey:String
var secondKey:Int
init(firstKey:String, secondKey:Int) {
self.firstKey = firstKey
self.secondKey = secondKey
}
}
struct DemoViewModel {
//结构体中的数组被包装成了Observable
let infoAry = Observable.just([DemoModel(firstKey: "1-1", secondKey: 1),
DemoModel(firstKey: "1-2", secondKey: 2),
DemoModel(firstKey: "1-3", secondKey: 3),
DemoModel(firstKey: "1-4", secondKey: 4)])
}
使用RxSwift框架实现的tableView,与原生实现的代码差异
- 不再需要声明遵循tableView的DataSource与delegate代理以及实现所有代理方法,Rx将其代理方法进行了封装。
- 结构体中的数据需要被RxSwift包装成了Observable信号。
- 在RAC中使用的组合式销毁来集中管理销毁RACSignal,而在RxSwift中与RAC类似的使用到了DisposeBag来实现Observable的集中销毁管理。在视图控制器或者其持有者将要销毁的时候,会自动释放掉绑定在它上面的资源。它是通过类似“订阅处置机制”方式实现(类似于 NotificationCenter 的 removeObserver)。
上手写代码的过程中,发现RxSwift的编译器代码提示在Xcode下实在是不友好,代码提示有时完全失效,只能手动写入其实现的方法与参数
现在了解了RxSwift框架的基本使用,在RxSwift的官方链接中也有demo可供参考,接下来一步一步深入分析RxSwift实现原理。关于RxSwift,计划在最后放几个自己用RxSwift实现的小demo,毕竟纸上得来终觉浅,还是要放到项目中体会。