ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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()를 합친 것이라고 보면 된다!






Designed by Tistory.