728x90
withLatestFrom
func withLatestFrom<Source>(_ second: Source)
-> Observable<Source.Element> where Source : ObservableConvertibleType
Summary해당 옵져버블이 element를 방출할 때마다 두 번째 옵져버블의 가장 최신 element를 사용하여 두 개의 옵져버블을 한 개의 옵져버블로 병합한다.
|
DiscussionNote
두 번째 옵져버블이 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 |
---|