这一篇,是一个仿Github注册的表单页面。官方针对这个例子,介绍了用RxSwift实现MVVM,一个是使用Driver 序列(针对UI界面的),另一个是Observable 序列。所以可以总结的知识点如下:
还是老样子,先说明这个例子做了什么。
其实就是一个很经典的注册表单界面:
以下摘自百度百科 MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点
Driver是RxSwift专门用于处理UI流的,相比Observable,它有以下特点:
Observable和Driver的用法基本一致,以下是一个转化例子
使用Observable:
validateUsername = input.username
.flatMapLatest { username in
return validationService.validateUsername(username)
.observeOn(MainScheduler.instance)
.catchErrorJustReturn(.failed(message: "Error contacting server"))
}
.shareReplay(1)
使用Driver:
validateUsername = input.username
.flatMapLatest { username in
return validationService.validateUsername(username)
.asDriver(onErrorJustReturn: .failed(message: "Error contacting server"))
}
使用 'Driver'的话,会自动地帮我们添加shareReplay(1),并且
.observeOn(MainScheduler.instance) .catchErrorJustReturn(.Failed(message: "Error contacting server"))
等语句,可以简洁的写为
.asDriver(onErrorJustReturn: .Failed(message: "Error contacting server"))
bindTo和driver的作用是一样的,都是绑定结果,可以直接这样理解:
使用bindTo,这里的viewModel.validateUsername是Observable类型
viewModel.validateUsername
.bind(to: usernameValidationOutlet.rx.validationResult)
.disposed(by: disposeBag)
使用driver,这里的viewModel.validateUsername是Driver类型
viewModel.validateUsername
.drive(usernameValidationOutlet.rx.validationResult)
.disposed(by: disposeBag)
具体的代码就不分析了,其实就跟之前几个例子是一样的。这个例子精华在于MVVM的思想,通过ViewModel将视图和模型绑定在一起,从而达到解耦的效果。