[RxSwift] withLatestFrom

역할

두 Observable중 첫번째 Observable에서 아이템이 방출될 때마다 그 아이템을 두번째 Observable의 가장 최근 아이템과 결합해 방출합니다.

예제

[코드]

let disposeBag = DisposeBag()
    
let numSubject  = PublishSubject<Int>()
let charSubject = PublishSubject<String>()
    
numSubject
    .withLatestFrom(charSubject) { "\($0)\($1)"}
    .subscribe(onNext: { print($0) })
    .disposed(by:disposeBag)
    
numSubject.onNext(1)     // 아이템 방출되지 않음 : charSubject에서 방출된 아이템이 아직 1개도 없으므로
    
charSubject.onNext("A")
    
numSubject.onNext(2)     // 2A
    
charSubject.onNext("B")
    
charSubject.onNext("C")
charSubject.onNext("D")
    
numSubject.onNext(3)     // 3D
numSubject.onNext(4)     // 4D
numSubject.onNext(5)     // 5D

[실행 결과]

2A
3D
4D
5D

numSubject에서 아이템이 방출될때만 withLatestFrom 연산이 수행됩니다. 첫번째 Observable에서 첫 아이템(A)이 방출된 시점에 두번째 Observable에서 방출된 아이템이 없으므로, 아무런 아이템이 방출되지 않고 그 이후 부터 아이템이 방출되는 것을 확인할 수 있습니다.

활용

첫번째 Observable: tap 이벤트

두번째 Observable: 이벤트에 대한 처리

두 Observable을 이렇게 구성 한 후 withLatestFrom 연산자를 이용해 결합하면, tap 이벤트가 발생 했을 때 필요한 데이터를 발생시키거나 관련된 처리를 하도록 사용할 수 있습니다.

withLatestFromUserful

[코드]

let disposeBag = DisposeBag()
    
let loginButton  = PublishSubject<Void>()
let usernameTextField = PublishSubject<String>()
    
loginButton
    .withLatestFrom(usernameTextField)
    .subscribe(onNext: { print($0) })
    .disposed(by:disposeBag)
    
usernameTextField.onNext("tome.kye")
    
loginButton.onNext(())      // "tome.kye" 아이템 방출
    
usernameTextField.onNext("tommy.kye")
    
loginButton.onNext(())      // "tomme.kye" 아이템 방출

[실행 결과]

tome.kye
tommy.kye

이 예제는 로그인 버튼 선택시 데이터를 전달합니다. .withLatestFrom(usernameTextField) 는 첫번째 Observable의 아이템과 합성하지 않고, 두번째 Observable 아이템만 그대로 전달합니다.

아래 이 코드는

loginButton
    .withLatestFrom(usernameTextField)
    .subscribe(onNext: { print($0) })
    .disposed(by:disposeBag)

다음과 같이 API를 찌르는데 필요한 인자를 전달하는 용도로도 사용 가능합니다.

loginButton
    .withLatestFrom(usernameTextField)
    .flatMap { username -> Observable<UserDataModel> in
    		return API.Request(username: username)
    }

[참 고]

Read more

카카오모빌리티 5년, 그 경험과 생각

2018년부터 2024년까지 5년 동안 카카오모빌리티에서 개발자로 일하며 얻은 경험과 느낀 점을 정리해 보았습니다. 개인적인 관점에서 작성된 내용이며, 제 경험이 회사 전체를 대표하지는 않습니다. 일 * 리더의 변화가 회사 분위기를 바꾼다. * 재직 중 CEO가 한 번 교체되었고, 그 후 CTO를 비롯한 여러 리더들이 함께 교체되었습니다. * 리더가 바뀌니 마치 다른 회사에 다니는 것처럼

By 토미
복잡한 마음이 든다면 적어보세요.

복잡한 마음이 든다면 적어보세요.

살다보면 분노, 불안, 우울 등 부정적인 감정이 찾아옵니다. 이런 감정은 시간이 지나면 금새 사라지기도 하지만, 때로는 계속 불쑥 불쑥 올라와서 마음을 혼란에 빠뜨립니다. 이럴 땐 한번 적어보세요. 내 마음은  왜 화가 났는지, 왜 불안한지, 왜 우울한지, 적다보면 부정정인 감정의 근본 원인이 무엇인지 그 감정을 어떻게 정리해야 할지 실마리를 찾을 수

By 토미
인생이란 책

인생이란 책

사람은 누구나 인생이란 책의 저자입니다.  모든 사람은 단 한 권의 책을 쓰고, 모든 책의 주인공은 저자 자신입니다.  1년의 삶을 한 페이지에 적는다고 했을 때, 책은 보통 80페이지 정도 되고, 많아도 120페이지를 넘기진 않습니다.  책에 한 번 써진 내용은 수정하거나 삭제할 수 없습니다. 마음에 들지 않는 페이지가 있더라도 찢어버릴 수 없습니다.

By 토미
박경리 - 산다는 것

박경리 - 산다는 것

체하면 바늘로 손톱 밑 찔러서 피 내고 감기들면 바쁜듯이 뜰 안을 왔다갔다 상처나면 소독하고 밴드하나 붙이고 정말 병원에는 가기 싫었다 약도 죽어라 안 먹었다 인명재천 나를 달래는 데 그보다 더 생광스런 말이 또 있을까 팔십이 가까워지고 어느 날부터 아침마다 나는 혈압약을 꼬박꼬박 먹게 되었다 어쩐지 민망하고 부끄러웠다 허리를 다쳐서 입원했을

By 토미


[책] 토미의 Git with 소스트리

Git을 제대로 알고 싶으신 분들께 추천드립니다.



[온라인 강의] 토미의 Git & Github

Git을 제대로 알고 싶으신 분들께 추천드립니다.