combineLatest
여러 TextField 를 한번에 관찰하고 값을 결합하거나, 여러 소스들의 상태를 보는 경우 많이 사용한다.
다음은 두 개의 TextField 인 idField, pwField 의 combineLatest 처리 예시이다. checkEmailValid 와 checkPasswordValid 는 리턴 값이 Bool 이고, 이에 따라 loginButton 의 활성화를 표현한다.
idField 의 값이 변경되면, 변경된 값을 통해 checkEmailValid 함수를 통과됨과 동시에, 자동으로 가장 최신의 pwField 의 값 또한 checkPasswordValid 함수를 통과하게 된다. 마찬가지로 pwField 값이 변경되면 반대로 적용된다.
즉, 최종적으로 반환하고자 하는 값을 위해 여러 조건들이 참이 되어야 할 때, combineLatest 를 통해 특정 조건의 변경될 때마다 계속해서 여러 조건과 함께 최종 조건이 참이 되는지 판단할 때 유용하다.
Observable.combineLatest(
idField.rx.text.orEmpty.map(checkEmailValid),
pwField.rx.text.orEmpty.map(checkPasswordValid),
resultSelector: { s1, s2 in s1 && s2 }
)
.subscribe(
onNext: { bool in
self.loginButton.isEnabled = bool
}
)
.disposed(by: disposeBag)
다음은 combineLatest 를 사용한 또 다른 예시이다.
print("----------combineLatest1----------")
let 성 = PublishSubject<String>()
let 이름 = PublishSubject<String>()
let 성명 = Observable.combineLatest(성, 이름) { 성, 이름 in
성 + 이름
}
성명
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
성.onNext("김")
이름.onNext("똘똘")
이름.onNext("영수")
이름.onNext("은영")
// '이름' 의 가장 최신 값인 '은영' 이 방출된다
성.onNext("박")
성.onNext("이")
성.onNext("조")
// '성'의 가장 최신 값인 '조' 가 방출된다.
이름.onNext("해웅")
----------combineLatest1----------
김똘똘
김영수
김은영
박은영
이은영
조은영
조해웅
print("----------combineLatest2----------")
let 날짜표시형식 = Observable<DateFormatter.Style>.of(.short, .long)
let 현재날짜 = Observable<Date>.of(Date())
let 현재날짜표시 = Observable
.combineLatest(
날짜표시형식,
현재날짜,
resultSelector: { 형식, 날짜 -> String in
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = 형식
return dateFormatter.string(from: 날짜)
}
)
현재날짜표시
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
----------combineLatest2----------
11/6/22
November 6, 2022
collection 을 인자로 받기도 한다. firstName 과 lastName 을 [firstName, lastName] 의 collection 형태로 나타낼 수 있다.
let lastName = PublishSubject<String>()
let firstName = PublishSubject<String>()
// collection 을 받기도 한다
let fullName = Observable.combineLatest([firstName, lastName]) { name in
name.joined(separator: " ")
}
fullName
.subscribe(onNext: {
print($0)
})
.disposed(by: disposeBag)
lastName.onNext("Kim")
firstName.onNext("Paul")
firstName.onNext("Stella")
firstName.onNext("Lily")
----------combineLatest3----------
Paul Kim
Stella Kim
Lily Kim
' iOS > RxSwift' 카테고리의 다른 글
RxSwift - 하나의 Observable 가 Trigger 역할 후 Observable 들을 조합하는 방법(withLatestFrom, sample, amb, switchLatest) (0) | 2022.11.06 |
---|---|
RxSwift - 여러 개의 Observable 을 합치는 방법(startWith, concat, merge, zip) (0) | 2022.11.06 |
RxSwift - MVVM 디자인 패턴 (0) | 2022.11.05 |
RxSwift - Transforming (0) | 2022.11.02 |
RxSwift - Filter (1) | 2022.11.01 |