📝
RxSwiftでbindが何をしているのか調べたのでメモ
このようにTextFieldが2つある画面を実装し、見てみたいと思います。
TextFieldViewModel.swift
class TextFieldViewModel: TextFieldViewModelType, TextFieldViewModelInputs, TextFieldViewModelOutputs {
var inputs: TextFieldViewModelInputs { return self }
var outputs: TextFieldViewModelOutputs { return self }
// MARK: Inputs
var lastNameTrigger = PublishRelay<String>()
var firstNameTrigger = PublishRelay<String>()
// 省略
}
}
TextFieldViewController.swift
class TextFieldViewController: UIViewController {
override func viewDidLoad() {
// bindで実装
firstNameTextField.rx.text.orEmpty
.bind(to: viewModel.inputs.firstNameTrigger)
.disposed(by: disposedBag)
// subscribeで実装
lastNameTextField.rx.text.orEmpty
.subscribe({ [weak self] event in
switch event {
case .next(let element):
// lastNameTriggerに要素をAcceptする
self?.viewModel.inputs.lastNameTrigger.accept(element)
case .error(_):
break
case .completed:
break
}
})
.disposed(by: disposedBag)
}
}
firstNameTextFieldとlastNameTextFieldで同じ挙動を示します
bind(to:)
の実態は内部でsubscribe
をして、accpetで値を流しているだけです
実際にはbind(to: )
にはObserverが複数個入ることができたりするので実際のコードとは少し違ったりします
↓公式の実装部分です。
RxSwiftは概念や仕組みを掴むのに時間がかかると思いますが、その一助になれば幸いです。
最後まで読んでいただきありがとうございました。
Discussion