📝

RxSwiftでbindが何をしているのか調べたのでメモ

2022/01/31に公開


このように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が複数個入ることができたりするので実際のコードとは少し違ったりします
↓公式の実装部分です。
https://github.com/ReactiveX/RxSwift/blob/5740d313d0c08c6ecaf47da34262e512a6cd3101/RxRelay/Observable%2BBind.swift#L43-L55

RxSwiftは概念や仕組みを掴むのに時間がかかると思いますが、その一助になれば幸いです。
最後まで読んでいただきありがとうございました。

Discussion