-
RxSwift - withLastestFrom(_:), sample(_:)에 대해서 알아보자Ray Wenderlich/RxSwift 2020. 2. 10. 20:58
Ch9. Combining operatiors p.191 - p.193
앱은 여러가지의 인풋을 다룬다. 여러 Observable에서 발생하는 이벤트들을 동시에 관리해야하는 경우가 많이 있을 것이다.
버튼을 누르는 등의 간단한 트리거 역할을 하는 인풋이 있을 수 있고, 동시에 다른 인풋에서는 데이터가 전달 될 수도 있다.
RxSwift는 이런 상황에 적절한 Operator를 제공하고 있다.
withLatestFrom(_:)
그림을 보면 두 개의 시퀀스가 있다.
그리고 withLatestFrom을 사용한 시퀀스가 있다.
tap 이벤트가 발생할 때, textfield의 마지막 Element의 값이 전달되고 있다.
우리가 자주 하는 UI코딩에서, button과 textfield를 사용하는 상황을 가정하고 있다. (뒤에서 RxCocoa를 통해 더 배울 것이다.)
let button = PublishSubject<Void>()
let textField = PublishSubject<String>()
let observable = button.withLatestFrom(textField)
_ = observable.subscribe(onNext: { value in
print(value)
})
textField.onNext("Par")
textField.onNext("Pari")
textField.onNext("Paris")
button.onNext(())
button.onNext(())
Paris
Paris
1. 두 개의 Subject를 생성했다.
2. withLatestFrom 오퍼레이터를 통해 위 그림처럼 하나의 Observable을 만들어 주었다.
3. 그림에 표현된 텍스트입력과 버튼터치를 코드로 통해 시뮬레이션하고 있다.
직관적이고 간단하다!
특정 트리거가 발생했을 때, 특정 상태의 최신 값을 얻고 싶을 때 사용하면 좋다.
withLatestFrom와 비슷한 sample오퍼레이터도 있다.
sample(_:)
위 withLatestFrom의 그림과 거의 동일하다.
딱 하나 차이점이 있다면, 두 번째 tap에는 "Paris"가 전달되지 않았다.
sample이 withLatestFrom와 다른점은, 새로운 값이 전달되지 않는다면 이벤트를 전달하지 않는다는 것이다.
위 코드에서 witeLatestFrom을 sample로 바꿔주면 결과를 확인할 수 있을 것이다.
let observable = button.withLatestFrom(textField) 을
let observable = textField.sample(button)으로 바꿔주면 결과를 확인할 수 있다.주의할점!!withLatestFrom을 호출하는 시퀀스는 button이지만,sample을 호출하는 시퀀스는 textfield다.**
sample(_:)은 withLatestFrom(_:) 과 distinctUntilChanged()를 합친 것이라고 보면 된다!
'Ray Wenderlich > RxSwift' 카테고리의 다른 글
RxSwift - retryWhen(_:)에 대해서 알아보자 (0) 2020.02.20 RxSwift - amb(_:), switchLatest()에 대해서 알아보자 (0) 2020.02.10 RxSwift - combineLatest(), zip() 에 대해서 알아보자. (1) 2018.07.13 RxSwift - merge()에 대해서 알아보자. (0) 2018.07.06 RxSwift - startWith(_:), concat(_:), concatMap(_:)에 대해서 알아보자. (0) 2018.07.05