-
RxSwift - CombineLatest & withLatestFromRxSwift 2021. 8. 9. 21:25
안녕하세요 그린입니다🟢
이번 포스팅에서는 CombineLatest와 withLatestFrom에 대해 알아보겠습니다🙋🏻
CombineLatest
- 두개의 Observable의 해당하는 각각의 이벤트가 발생할때 최신으로 수신된 이벤트를 묶어 전달
쉽게 코드를 통해서 이해하자면 아래와 같이 정의해볼 수 있다.
let owner = Observable.from(["철수", "영희", "준석", "정인"]) let pet = Observable.from(["cat", "dog", "bird", "pig"]) Observable.combineLatest(owner, pet, resultSelector: { (owner: String, pet: String) return (owner, pet) } ) .subscribe{ event in print(event) }.disposed(by: disposeBag) // ("철수", "cat") // ("영희", "cat") // ("영희", "dog") // ("준석", "bird") // ("정인", "bird") // ("정인", "pig")
위와 같이 2개의 Observable을 combineLatest하면 순서대로 합쳐서 2개의 아웃풋을 방출한다.
combineLatest로 합성 가능한 최대 Observable은 8개이다.
withLatestFrom
- combineLatest와 다르게 각기 두개의 Observable을 합성하는 동일점은 있지만 첫번째 Observable의 이벤트가 발생해야 묶어 아웃풋을 전달한다.
- 첫번째의 이벤트가 없다면 이벤트는 발생하여 전달되지 않고 넘어간다.
위의 그림을 보면 알 수 있듯이 combineLatestFrom의 경우는 A가 들어오면 1과 A를 합성하여 방출하지만
withLatestFrom은 2라는 첫번째 Observable의 새로운 이벤트가 발생해야 2와 A를 합성하여 2A라는 아웃풋을 합성해 반환한다.
조금 더 쉽게 이해하자면 2라는 새로운 이벤트가 발생되었을때 최신값인 A와 매칭시켜 2A를 반환하고,
B라는 이벤트가 방출되면 2외에 다른 새로운 방출값이 없어 스킵된다.
3이 방출되는 시점에서는 D라는 B,C와 다른 새로운 이벤트가 있음으로 3D를 반환한다.
4와 5도 마찬가지로 새로운 이벤트가 방출되어 최신의 값인 D를 합성해 반환한다.
그렇다면 아래와 같이 간단한 코드로 이해해보자💻
let inputNum = PublishSubject<Int>() let inputStr = PublishSubject<String>() inputNum .withLatestFrom(inputStr) { "\($0)\($1)"} .subscribe(onNext: { print($0) }) .disposed(by:disposeBag) // 방출 X inputNum.onNext(1) inputStr.onNext("일") // 2일 inputNum.onNext(2) inputStr.onNext("이") inputStr.onNext("삼") inputStr.onNext("사") // 3사 inputNum.onNext(3) // 4사 inputNum.onNext(4) // 5사 inputNum.onNext(5)
위와 같이 방출된다.
쉽게 말해 첫번째 Observable의 1이 방출되는 시점에선 inputStr의 이벤트가 없었음으로 아무것도 반환되지 않는다.
이후 2가 방출될때 "일"이라는 최근 방출 이벤트값이 있어 "2일"이 반환된다.
이런식으로 두번째의 최근 이벤트와 첫번째의 변화된 이벤트를 혼합한것이 withLatestFrom이다.
이렇게 combineLatest와 withLatestFrom을 살펴보았다.
비슷한듯 다른 이 두가지는 Rx를 구성하며 이벤트들을 어떻게 처리할지에 따라 많이 쓰인다.
좀 더 적재적소에 쓸 수 있도록 많은 연습이 필요할것 같다🤔
[참고자료]
https://developer.apple.com/documentation/combine/just/combinelatest(_:)
https://coding-time.co/rx-combinelatest-vs-withlatestfrom/
'RxSwift' 카테고리의 다른 글
RxSwift - Zip (0) 2021.10.13 RxSwift - Buffer & Window (0) 2021.10.06 RxSwfit - Debounce & Throttle (0) 2021.10.02 concat & merge (0) 2021.08.16 RxSwift (0) 2021.04.15