RxSwiftを使っていて、Observable.mergeとCombineLatestにおいて混乱したので、その違いをここにメモする。
Observable.mergeとは?
- 具体例を持って説明する。
import RxRelay
class ExampleViewModel {
// input
let didTappedButton = PublishRelay<Void>()
let didInputtedTextField = PublishRelay<String>()
init() {
let fetchSomethingResult = Observable.merge(didTappedButton, didInputtedTextField)
.flatMap {
repository.fetchSomething()
}
.share()
}
- このような形でViewModelがあった場合に、
Observable.merge
を利用すると、didTappedButton
もしくは、didInputtedTextField
に値が流れてくるたびに、repository.fetchSomething()
が行われる。 - つまり、
Observable.merge
内で指定されている値をどちらも監視してくださいと言う意味である。
CombineLatestとは?
具体例をもって説明する。
import RxRelay
class ExampleViewModel {
// input
let didTappedButton = PublishRelay<Void>()
let didInputtedTextField = PublishRelay<String>()
init() {
let fetchSomethingResult = Observable
.combineLatest(didTappedButton, didInputtedTextField)
.flatMap {
repository.fetchSomething()
}
.share()
}
- このような形のVMがあった場合に、
combineLatest
を使うとdidTappedButton
とdidInputtedTextField
の両方に値が流れてきた時にかrepository.fetchSomething()
が実行されない。 -
Observable.merge
との違いとしては、didTappedButton
のみがタップされても、repository.fetchSomething()
が実行されないことである。 - つまり、
combineLatest
を使う場合は、監視される値は両方の値が流れないと意味をなさないものである。