一、前言
ViewModel是MVVM架构模式与MVC架构模式最大的区别点。MVVM架构模式把业务逻辑从controller集中到了ViewModel中,ViewModel的业务模型如下:
viewmodel相当于是一个黑盒子,封装了业务逻辑,进行输入和输出的转换。
其中View、Model与MVC架构模式下负责的任务相同。controller由于业务逻辑移到了Viewmodel中,它本身担起了中间调用者角色,负责把View和Viewmodel绑定在一起。
需要配合RxSwift框架使用
二、构建ViewModel
不用Subject
这种方案简单易行,只需要一次性提供Input给ViewModel,然后ViewModel即可给出Output。
定义ViewModelType协议
protocol ViewModelType {
associatedtype Input
associatedtype Output
func transform(input: Input) -> Output
}
让我们创建示例Demo:
输入内容,然后点击“确定”按钮。最后,显示校验结果。
创建SayHelloViewModel
final class SayHelloViewModel: ViewModelType {
struct Input {
let name: Observable<String>
let validate: Observable<Void>
}
struct Output {
let greeting: Driver<String>
}
func transform(input: Input) -> Output {
let greeting = input.validate
.withLatestFrom(input.name)
.map {
name in
return "Hello \(name)!"
}
.startWith("")
.asDriver(onErrorJustReturn: ":-(")
return Output(greeting: greeting)
}
}
创建SayHelloViewController
final class SayHelloViewController: UIViewController {
@IBOutlet weak var nameTextField: UITextField!
@IBOutlet weak var validateButton: UIButton!
@IBOutlet weak var greetingLabel: UILabel!
private let viewModel = SayHelloViewModel()
private let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
bindViewModel()
}
private func bindViewModel() {
let inputs = SayHelloViewModel.Input(name:nameTextField.rx.text.orEmpty.asObservable(),
validate: validateButton.rx.tap.asObservable())
let outputs = viewModel.transform(input: inputs)
outputs.greeting
.