🍏/RxSwift
[RxSwift-Operator] withLatestFrom과 combineLatest
eungding
2019. 4. 29. 16:45
728x90
반응형
Combining Operators 중 대표적인 두가지를 살펴보자
[ 1 ] withLatestFrom
ObservableType extension에 가보면
public func withLatestFrom<SecondO: ObservableConvertibleType>(_ second: SecondO) -> Observable<SecondO.E> {
return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: { $1 })
}
이렇게 구현되어있다
어떤 옵져버블 뒤에 withLatestFrom(Observable) 해주면 어떤 옵져버블의 이벤트가 발행될때마다 매개변수로 넘겨준 observable의 the latest element를 얻는다
예제를 보는 게 이해가 빠르다 --!
let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
// button 이벤트가 발행될때마다 매개변수로 넘겨준 textField observable의 the latest element를 얻는다
let observable: Observable<String> = button.withLatestFrom(textField)
observable.subscribe(onNext: {
print($0)
})
textField.onNext("Par")
button.onNext(())
textField.onNext("Pari")
textField.onNext("Paris")
button.onNext(())
button.onNext(())
// 출력값
Par
Paris
Paris
withLatestFrom 순서를 거꾸로 해보면..ㅎㅎ
// textField 이벤트가 발행될때마다 button Observable의 가장 최근의 값을 얻는다
let observable: Observable<Void> = textField.withLatestFrom(button)
observable.subscribe(onNext: {
print($0)
})
textField.onNext("Par")
button.onNext(())
textField.onNext("Pari")
textField.onNext("Paris")
button.onNext(())
button.onNext(())
// 출력값
()
()
[ 2 ] combineLatest
let left = PublishSubject<Int>()
let right = PublishSubject<Int>()
let observable = Observable.combineLatest(left, right, resultSelector: {
lastLeft, lastRight in
"\(lastLeft) \(lastRight)"
})
observable.subscribe(onNext: {
print($0)
})
left.onNext(1)
right.onNext(4)
right.onNext(5)
left.onNext(2)
right.onNext(6)
left.onNext(3)
// 출력값
1 4
1 5
2 5
2 6
3 6
Reference
RayWenderlich - RxSwift
반응형