훌이
후리스콜링개발
훌이

블로그 메뉴

  • 왈 (iOS APP)
  • Github
전체 방문자
오늘
어제
  • 전체 (171)
    • ⭐️ 개발 (140)
      • JAVA (4)
      • Web (5)
      • iOS & Swift (94)
      • iOS Concurrency (4)
      • Rx (18)
      • Git (6)
      • WWDC (1)
      • Code Refactor (3)
      • Server (1)
    • ⭐️ Computer Science (22)
      • 운영체제 (10)
      • 네트워크 (5)
      • PS (7)
    • 경제시사상식 (8)
    • 기타 등등 (0)

인기 글

최근 글

05-16 04:47

티스토리

hELLO · Designed By 정상우.
훌이

후리스콜링개발

[Rx Operator 시리즈] 3. Zip
⭐️ 개발/Rx

[Rx Operator 시리즈] 3. Zip

2023. 1. 16. 18:07
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
    '⭐️ 개발/Rx' 카테고리의 다른 글
    • [Rx Operator 시리즈] 4. flatMap / flatMapFirst / flatMapLatest
    • [Rx] NSObject+Rx 라이브러리
    • [Rx Operator 시리즈] 2. CombineLatest
    • [Rx Operator 시리즈] 1. map
    훌이
    훌이

    티스토리툴바