728x90
반응형
소스 옵저버블이 방출하는 최신 요소를 병합하는 combineLatest 연산자
소스 옵저버블들을 결합해 방출하는 최신 이벤트를 대상으로 연산자를 실행해 결과 옵저버블을 방출
enum MyError: Error {
case error
}
let greetings = PublishSubject<String>()
let languages = PublishSubject<String>()
Observable
.combineLatest(greetings, languages) { first, second -> String in
return "\(first) \(second)"
}
.subscribe {
print($0)
}
.disposed(by: disposeBag)
greetings.onNext("Hi")
languages.onNext("RuheeKim") // next(Hi RuheeKim)
greetings.onNext("안녕") //next(안녕 RuheeKim)
languages.onNext("후리방구") // next(안녕 후리방구)
languages.onCompleted()
/* language 소스 옵저버블이 complete 이벤트를 전달해도
greeting 소스 옵저버블이 complete 이벤트를 전달하지 않았기 때문에 */
greetings.onNext("Bye") // next(Bye 후리방구)
greetings.onCompleted() // completed
그러나 중간에 languages.onCompleted 대신에 onError 이벤트를 전달하면 그 즉시 중단된다.
소스 옵저버블에서 하나라도 에러 이벤트를 전달하면 바로 중단
코드 예시
let bag = DisposeBag()
@IBOutlet weak var backgroundColorView: UIView!
@IBOutlet weak var redSlider: UISlider!
@IBOutlet weak var greenSlider: UISlider!
@IBOutlet weak var blueSlider: UISlider!
let sliderObservable = Observable.combineLatest([redSlider.rx.value,
greenSlider.rx.value,
blueSlider.rx.value])
sliderObservable
.map { UIColor(red: CGFloat($0[0]) / 255,
green: CGFloat($0[1]) / 255,
blue: CGFloat($0[2]) / 255,
alpha: 1) }
.bind(to: backgroundColorView.rx.backgroundColor)
.disposed(by: bag)
combineLatest는 두 개의 소스 옵저버블의 최신 값들을 결합해서 이벤트를 방출하기 때문에 로긘 버튼이 아이디, 비번의 유효값을 확인하기에는 적합하지만, 로그인 서버통신에는 적합하지 않다. 왜냐하면 만약 내가 아이디 값을 고치는 순간마다 서버통신을 진행하기 때문이다.
별개로 combineLatest는 테블뷰의 Item, model의 데이터를 동시에 전달 받기 위해 사용하기에는 좋다. 그 경우 combineLatest로 묶어주면 변동 시마다 값을 전달하기 때문에 유용하다.
combineLatest는 두 개 이상의 비동기적인 데이터를 조합할 때 유용합니다.
예를 들어, 사용자의 위치 정보와 날씨 정보를 조합하여 UI를 업데이트하는 경우 등이 있습니다.
아래 코드는 사용자의 위치 정보와 날씨 정보를 조합하여 UI를 업데이트하는 예시입니다.
728x90
반응형
'⭐️ 개발 > Rx' 카테고리의 다른 글
[Rx] NSObject+Rx 라이브러리 (1) | 2023.01.18 |
---|---|
[Rx Operator 시리즈] 3. Zip (0) | 2023.01.16 |
[Rx Operator 시리즈] 1. map (0) | 2023.01.16 |
7. Traits - ControlProperty, ControlEvent, Driver (0) | 2023.01.16 |
6. Binder (0) | 2023.01.16 |