withLatestFrom
💥🔫 의 withLatestFrom 연산자에 '달리기선수' 라는 Observable 을 두면 💥🔫 가 이벤트를 방출하였을 때, '달리기선수'가 방출하였던 제일 최신 값이 방출된다.
print("----------withLatestFrom----------")
let 💥🔫 = PublishSubject<Void>()
let 달리기선수 = PublishSubject<String>()
💥🔫.withLatestFrom(달리기선수)
// .distinctUntilChanged() //Sample과 똑같이 쓰고 싶을 때
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
달리기선수.onNext("🏃🏻♀️")
달리기선수.onNext("🏃🏻♀️ 🏃🏽♂️")
달리기선수.onNext("🏃🏻♀️ 🏃🏽♂️ 🏃🏿")
💥🔫.onNext(Void())
💥🔫.onNext(Void())
----------withLatestFrom----------
🏃🏻♀️ 🏃🏽♂️ 🏃🏿
🏃🏻♀️ 🏃🏽♂️ 🏃🏿
sample
withLatestFrom 과 유사하게 작동하지만, 단 한번만 출력이 된다.
print("----------sample----------")
let 🏁출발 = PublishSubject<Void>()
let F1선수 = PublishSubject<String>()
F1선수.sample(🏁출발)
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
F1선수.onNext("🏎")
F1선수.onNext("🏎 🚗")
F1선수.onNext("🏎 🚗 🚙")
🏁출발.onNext(Void())
🏁출발.onNext(Void())
🏁출발.onNext(Void())
----------sample----------
🏎 🚗 🚙
amb
두 가지 Sequence 를 받을 때, 그 중에서 어떤 것을 subscribe 해야 할지 애매모호 할 때 사용하는 방식이다.
두 가지 Observable 을 모두 구독하기는 하지만, 두 개중 어떤 것이든 요소를 먼저 방출을 시작하면, 나머지 Observable 은 구독하지 않는다.
버스1, 버스2 를 모두 주시하고 있다가, 버스2가 onNext 이벤트로 값이 먼저 방출되는 것을 확인한 후 버스1 의 구독을 끊는 것이다.
print("----------amb----------")
let 🚌버스1 = PublishSubject<String>()
let 🚌버스2 = PublishSubject<String>()
let 🚏버스정류장 = 🚌버스1.amb(🚌버스2)
🚏버스정류장.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
🚌버스2.onNext("버스2-승객0: 👩🏾💼")
🚌버스1.onNext("버스1-승객0: 🧑🏼💼")
🚌버스1.onNext("버스1-승객1: 👨🏻💼")
🚌버스2.onNext("버스2-승객1: 👩🏻💼")
🚌버스1.onNext("버스1-승객1: 🧑🏻💼")
🚌버스2.onNext("버스2-승객2: 👩🏼💼")
----------amb----------
버스2-승객0: 👩🏾💼
버스2-승객1: 👩🏻💼
버스2-승객2: 👩🏼💼
switchLatest
Source Observable 로 들어온 마지막 sequence 가 방출하는 요소만 subscribe 한다.
Source Observable 인 손들기 Observable 이 "👩🏻💻학생1" 에 대해 onNext 이벤트로 방출될 경우 가장 최신이 되는 👩🏻💻학생1 이 방출하는 요소만 구독하게 된다.
print("----------switchLatest----------")
let 👩🏻💻학생1 = PublishSubject<String>()
let 🧑🏽💻학생2 = PublishSubject<String>()
let 👨🏼💻학생3 = PublishSubject<String>()
// source observable
let 손들기 = PublishSubject<Observable<String>>()
let 손든사람만말할수있는교실 = 손들기.switchLatest()
손든사람만말할수있는교실
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
손들기.onNext(👩🏻💻학생1)
👩🏻💻학생1.onNext("👩🏻💻학생1: 저는 1번 학생입니다.")
🧑🏽💻학생2.onNext("🧑🏽💻학생2: 저요 저요!!!")
손들기.onNext(🧑🏽💻학생2)
🧑🏽💻학생2.onNext("🧑🏽💻학생2: 저는 2번이예요!")
👩🏻💻학생1.onNext("👩🏻💻학생1: 아.. 나 아직 할말 있는데")
손들기.onNext(👨🏼💻학생3)
🧑🏽💻학생2.onNext("🧑🏽💻학생2: 아니 잠깐만! 내가! ")
👩🏻💻학생1.onNext("👩🏻💻학생1: 언제 말할 수 있죠")
👨🏼💻학생3.onNext("👨🏼💻학생3: 저는 3번 입니다~ 아무래도 제가 이긴 것 같네요.")
손들기.onNext(👩🏻💻학생1)
👩🏻💻학생1.onNext("👩🏻💻학생1: 아니, 틀렸어. 승자는 나야.")
🧑🏽💻학생2.onNext("🧑🏽💻학생2: ㅠㅠ")
👨🏼💻학생3.onNext("👨🏼💻학생3: 이긴 줄 알았는데")
🧑🏽💻학생2.onNext("🧑🏽💻학생2: 이거 이기고 지는 손들기였나요?")
----------switchLatest----------
👩🏻💻학생1: 저는 1번 학생입니다.
🧑🏽💻학생2: 저는 2번이예요!
👨🏼💻학생3: 저는 3번 입니다~ 아무래도 제가 이긴 것 같네요.
👩🏻💻학생1: 아니, 틀렸어. 승자는 나야.
' iOS > RxSwift' 카테고리의 다른 글
RxSwift - TimeBasedOperators (0) | 2022.11.07 |
---|---|
RxSwift - Sequence 내부의 요소들간의 결합 연산자(reduce, scan) (0) | 2022.11.07 |
RxSwift - 여러 개의 Observable 을 합치는 방법(startWith, concat, merge, zip) (0) | 2022.11.06 |
RxSwift - 여러 개의 Observable 을 합치는 방법(combineLatest) (0) | 2022.11.06 |
RxSwift - MVVM 디자인 패턴 (0) | 2022.11.05 |