728x90
반응형
combineLatest와 다른 점? : 클로저에게 중복된 요소를 전달하지 않고, 인덱스를 기준으로 짝을 맞춰서 전달.
첫 번째 요소는 첫 번째 요소와 결합
두 번째 요소는 두 번째 요소와 결합
세 번째 요소는 세 번재 요소와 결합
Indexed Sequencing이라고 함
결합할 요소가 없으면 방출하지 않음
let numbers = PublishSubject<Int>()
let strings = PublishSubject<String>()
Observable.zip(numbers, strings) { "\($0) - \($1)" }
.subscribe { print($0) }
.disposed(by: disposeBag)
numbers.onNext(1)
strings.onNext("One")
// next(1 - One)
numbers.onNext(2)
// 만약 combineLatest 였다면 next(2 - One)이라고 출력됐을 거임
strings.onNext("Two")
// next(2 - Two)
numbers.onCompleted()
strings.onNext("Three")
// Three와 결합할 numbers 소스 옵저버블이 방출하는 이벤트가 없음
strings.onCompleted()
// completed
만약 중간에 numbers.onCompleted() 대신에 numbers.onError(MyError.error) 를 전달하면 어떻게 될까?
-> 소스 옵저버블 중에서 하나라도 에러 이벤트를 전달하면 그 즉시 구독자에게 에러 이벤트가 전달되고 종료됨
zip 연산자는 두 개 이상의 옵저버블에서 각각 인덱스에 해당하는 이벤트를 조합하여 처리할 때 사용됩니다.
예를 들어, 두 개의 텍스트 필드에서 값을 입력받아 서버로 전송하는 경우 등에서 활용될 수 있습니다.
다음은 zip 연산자를 사용한 예시입니다.
// 두 개의 텍스트 필드
let firstNameTextField = UITextField()
let lastNameTextField = UITextField()
// 전송 버튼
let sendButton = UIButton()
// 두 개의 텍스트 필드의 값을 결합하여 전송 버튼 활성화
let isFormValidObservable = Observable.zip(
firstNameTextField.rx.text.orEmpty,
lastNameTextField.rx.text.orEmpty
)
.map { firstName, lastName in
return !firstName.isEmpty && !lastName.isEmpty
}
// 전송 버튼의 활성화 여부를 바인딩
isFormValidObservable
.bind(to: sendButton.rx.isEnabled)
.disposed(by: disposeBag)
// 전송 버튼 클릭 시 두 개의 텍스트 필드의 값을 서버로 전송하는 함수
func send() {
guard let firstName = firstNameTextField.text,
let lastName = lastNameTextField.text else { return }
// firstName과 lastName 값을 서버로 전송
APIClient.send(firstName: firstName, lastName: lastName)
.subscribe(onCompleted: {
print("Data sent successfully")
})
.disposed(by: disposeBag)
}
// 전송 버튼 클릭 시 두 개의 텍스트 필드의 값을 서버로 전송
sendButton.rx.tap
.subscribe(onNext: {
send()
})
.disposed(by: disposeBag)
728x90
반응형
'⭐️ 개발 > Rx' 카테고리의 다른 글
[Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest (0) | 2023.01.19 |
---|---|
[Rx] NSObject+Rx 라이브러리 (1) | 2023.01.18 |
[Rx Operator 시리즈] 2. CombineLatest (0) | 2023.01.16 |
[Rx Operator 시리즈] 1. map (0) | 2023.01.16 |
7. Traits - ControlProperty, ControlEvent, Driver (0) | 2023.01.16 |