iOS/Rx

[ Rx ] 결합 연산 - 1. withLatestFrom

Forest Yun 2023. 10. 6. 19:20
728x90

 

withLatestFrom

func withLatestFrom<Source>(_ second: Source) 
   -> Observable<Source.Element> where Source : ObservableConvertibleType

Summary

해당 옵져버블이 element를 방출할 때마다 두 번째 옵져버블의 가장 최신 element를 사용하여 두 개의 옵져버블을 한 개의 옵져버블로 병합한다.

Discussion

Note
두 번째 옵져버블이 element를 방출하기 전, 해당 옵져버블이 element를 방출한다면 그건 누락될 것이다. 즉, 아무런 작업도 일어나지 않는다.

Parameters

매개변수로는 두 번째 옵져버블이 온다

Returns

해당 옵져버블의 element와 두 번째 옵져버블의 최신 element 각각을 결합한 결과를 포함하는 옵져버블이 반환된다.

 

 

두 번째 옵져버블 먼저

Rx로 처음 프로젝트를 하면서 많이 실수했던 부분이 바로 각 옵져버블의 element 방출 시점이었다. 매개변수로 오는 두 번째 옵져버블에서 먼저 element가 방출되지 않으면 첫 번째 옵져버블에 아무리 element를 보내도 아무 일도 일어나지 않는다.

아래 예시를 보면 첫 번째(숫자) 옵져버블에 element가 먼저 방출된 후 두 번째(알파벳) 옵져버블이 방출되었기 때문에 결과 옵져버블에서 [1]을 결합한 element는 방출되지 않았다. 

 

 

 

두 번째 옵져버블의 최신 element와 결합

다음 주의해야 할 부분은, 첫 번째 옵져버블은 매개변수로 오는 두 번째 옵져버블의 최신 element와만 결합하는 점이다. 

아래 예시를 보면 두 번째(알파벳) 옵져버블의 element로 [A]와 [B]가 방출되었다.

[A]가 방출된 후 [B] 방출 전까지 첫 번째(숫자) 옵져버블은 모두 [A]와 결합하여 결과 옵져버블의 element로 방출되었고,  [1A], [2A] 

[B]가 방출된 이후로는 [B]와 결합하여 결과 옵져버블의 element로 방출되었다.  [3B], [4B], [5B] 

 

 

 

 

withLatestFrom 사용하기

print("----------withLatestFrom----------")
let triger = PublishSubject<String>()
let runner = PublishSubject<String>()

triger
    .withLatestFrom(runner, resultSelector: { t, r in
       (t: t, r: r)
    })
    .subscribe(onNext: { // 옵져버블은 구독해야 작동한다
        print("\($0.t) \($0.r)")
    })
    .disposed(by: disposeBag)

runner.onNext("🏃‍♀️") // 두 번째 옵져버블 먼저 element 방출
runner.onNext("🏃‍♀️ 🏃‍♀️")
runner.onNext("🏃‍♀️ 🏃‍♀️ 🏃‍♀️") // 두 번째 옵져버블의 최신 element만 사용

triger.onNext("1번 출발") 
triger.onNext("2번 출발")

// ----------withLatestFrom----------
// 1번 출발 🏃‍♀️ 🏃‍♀️ 🏃‍♀️
// 2번 출발 🏃‍♀️ 🏃‍♀️ 🏃‍♀️

 

 

 

 

RxMarbles
728x90

'iOS > Rx' 카테고리의 다른 글

[ iOS/Rx ] 1. RxSwift란?  (0) 2023.06.27