본문 바로가기

개발

RxSwift Combining Operators

728x90

RxSwift는 강력한 방식으로 여러 Observable 스트림을 결합, 병합 및 동기화 할 수 있는 풍부한 결합 연산자 세트를 제공합니다 . 이러한 연산자는 복잡한 데이터 상호 작용 및 종속성을 처리하는 반응형 애플리케이션을 구축하는 데 필수적입니다. RxSwift 결합 연산자를 사용하는 방법에 대한 몇 가지 실제적인 예를 살펴보겠습니다.

1. 관찰 가능한 스트림 병합:

  • 문제: 여러 개의 Observable 스트림을 단일 스트림으로 결합하고, 각 스트림에서 동시에 항목을 방출합니다.
  • 해결책: 연산자를 사용하여 merge여러 Observable 스트림을 결합하면 각 스트림의 항목이 섞이지 않고 내보내질 수 있습니다.
import RxSwift



let numbersObservable1 = Observable.of(1, 2, 3)

let numbersObservable2 = Observable.of(4, 5, 6)

let numbersObservable3 = Observable.of(7, 8, 9)



let mergedObservable = Observable.merge(numbersObservable1, numbersObservable2, numbersObservable3)



mergedObservable.subscribe(onNext: { number in

  print("Received number: \(number)")

})

 

  • 설명:

숫자 시퀀스를 각각 방출하는 세 개의 Observable 스트림을 생성합니다 .
세 개의 스트림을 하나의 스트림으로 결합하는 데 사용됩니다 .merge
병합된 스트림을 구독하고 받은 각 번호를 인쇄하세요.

 

2. 여러 스트림의 최신 값 결합:

  • 문제: 여러 Observable 스트림의 최신 값을 단일 스트림으로 결합하고, 스트림 중 하나에서 새 값이 방출될 때마다 이를 방출합니다.
  • 해결책: 연산자를 사용하여 combineLatest여러 스트림의 최신 값을 결합하고, 입력 스트림 중 하나에서 새 값이 나올 때마다 새 값을 내보냅니다.
import RxSwift



let nameTextField = UITextField()

let ageTextField = UITextField()



let nameObservable = nameTextField.rx.text.map { $0 ?? "" }

let ageObservable = ageTextField.rx.text.map { $0 ?? "0" }



let combinedObservable = nameObservable

  .combineLatest(with: ageObservable) { name, age in

    "\(name) is \(age) years old"

  }



combinedObservable.subscribe(onNext: { message in

  print(message)

  // Update UI with the combined message

})

 

  • 설명:

이름과 나이 텍스트 필드의 텍스트 입력에 대한 Observable을 만듭니다.
combineLatest두 스트림의 최신 값을 결합하여 두 스트림 중 하나에서 새 값이 나올 때마다 새 문자열을 생성하는 데 사용됩니다 .
결합 스트림을 구독하고 결합된 메시지를 인쇄하세요.

 

3. 일치하는 요소로 여러 스트림 압축:

  • 문제: 해당 시간에 방출되는 여러 Observable 스트림의 요소를 결합하여 튜플로 묶습니다.
  • 해결책: 연산자를 사용하여 zip해당 시간에 방출되는 여러 스트림의 요소를 결합하여 쌍을 이룬 요소의 튜플을 생성합니다.
import RxSwift



let numbersObservable = Observable.of(1, 2, 3)

let charactersObservable = Observable.of("A", "B", "C")



let zippedObservable = numbersObservable.zip(with: charactersObservable) { number, character in

  "\(number) - \(character)"

}



zippedObservable.subscribe(onNext: { pair in

  print(pair)

})

 

  • 설명:

숫자와 문자에 대한 Observable을 만듭니다.
zip두 스트림의 요소를 결합하여 일치하는 각 쌍에 대한 문자열을 방출하는 데 사용됩니다 .
압축 스트림을 구독하고 각 쌍을 인쇄하세요.

 

4. 타이머 또는 트리거로 스트림 사용:

  • 문제: 하나의 Observable 스트림을 사용해 다른 스트림에서 항목이 방출됨에 따라 작업을 트리거하거나 값을 방출합니다.
  • 해결 방법: , , 또는 연산자를 사용하여 다른 스트림에서 항목이 방출됨에 따라 작업을 트리거하거나 값을 방출합니다.withLatestFrom startWithsample
import RxSwift



let buttonTaps = button.rx.tap

let randomNumbers = Observable.create { observer in

  // Simulate a random number generator

  while true {

    observer.onNext(Random.shared.nextInt(in: 1...100))

    Thread.sleep(forTimeInterval: 0.5)

  }

}



let filteredNumbers = buttonTaps

  .withLatestFrom(randomNumbers) { tap, number in

    number % 2 == 0 ? number : -1

  }

  .filter { $0 >= 0 }



filteredNumbers.subscribe(onNext: { number in

  print("Filtered number: \(number)")

})

 

  • 설명:

버튼 탭과 난수에 대한 Observable을 만듭니다.
withLatestFrom각 버튼을 탭할 때마다 최신 난수를 결합하여 필터링하는 데 사용합니다 .

'개발' 카테고리의 다른 글

RxSwift로 로그인 로직 만들기  (0) 2024.07.09
RxSwift Share Operators  (0) 2024.07.09
RxSwift Transforming Operators  (0) 2024.07.09
RxSwift Filtering Operators  (0) 2024.07.09
RxSwift Observables and Subjects  (0) 2024.07.09