개발

RxSwift Transforming Operators

한번사는인생~키야 2024. 7. 9. 12:40
728x90

RxSwift는 강력한 방식으로 데이터 스트림을 조작하고 변환할 수 있는 다양한 변환 연산자를 제공합니다. 이러한 연산자는 복잡한 데이터 처리 및 프레젠테이션을 처리하는 반응형 애플리케이션을 구축하는 데 필수적입니다. RxSwift 변환 연산자를 사용하는 방법에 대한 몇 가지 실제적인 예를 살펴보겠습니다.

1. 매핑 데이터 유형:

  • 문제: Observable 스트림 내에서 값을 한 데이터 유형에서 다른 데이터 유형으로 변환합니다.
  • 해결책: 연산자를 사용하여 map방출된 각 값에 변환 함수를 적용합니다.
import RxSwift



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



let squaredNumbersObservable = numbersObservable

  .map { $0 * $0 }



squaredNumbersObservable.subscribe(onNext: { number in

  print("Squared number: \(number)")

})

 

  • 설명:

numbersObservable정수 시퀀스를 방출합니다.
map각 숫자를 제곱하고 변환된 값을 내보냅니다.
닫힘 subscribe은 제곱 숫자를 인쇄합니다.

 

 

2. 중첩된 Observables를 평평하게 만들기:

  • 문제: 여러 개의 중첩된 Observable을 하나의 스트림으로 병합하거나 결합합니다.
  • 해결책: or 연산자를 사용하여 중첩된 구조를 평면화하고 내부 Observables에서 값을 내보냅니다.flatMapflatMapLatest
import RxSwift



let clicksObservable = button.rx.tap

  .map { _ -> Observable<Int> in

    Observable.create { observer in

      // Simulate a random delay before emitting a value

      Thread.sleep(forTimeInterval: Random.shared.nextDouble(in: 0.5...1.5))

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

      observer.onCompleted()

    }

  }

  .flatMapLatest { numberObservable -> Observable<String> in

    numberObservable

      .map { "Number emitted: \($0)" }

  }



clicksObservable.subscribe(onNext: { message in

  print(message)

})

 

  • 설명:

clicksObservable버튼을 탭합니다.
map각 탭에 대해 내부 Observable을 생성하여 무작위 지연을 시뮬레이션하고 무작위 숫자를 내보냅니다.
flatMapLatest중첩된 Observable 구조를 평면화하고 변환된 메시지를 내보냅니다("내보낸 숫자: <무작위 숫자>").
닫힘 subscribe은 메시지를 인쇄합니다.

 

 

3. 여러 개의 관찰 가능한 항목 결합:

  • 문제: 여러 Observable의 값을 단일 스트림으로 결합합니다.
  • 해결책: , , , 또는 연산자를 사용하여 특정 타이밍 규칙에 따라 여러 Observable의 방출을 결합합니다.combineLatest zip withLatestFromstartWith
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

})

 

  • 설명:

nameObservable이름 텍스트 필드에서 텍스트를 내보냅니다.
ageObservable나이 텍스트 필드에서 텍스트를 내보냅니다.
combineLatest두 Observable의 최신 값을 결합하여 새로운 문자열을 생성합니다.
닫힘 subscribe은 결합된 메시지를 인쇄합니다.

 

4. 오류 처리 및 복구:

  • 문제: 오류를 우아하게 처리하고 값을 다시 시도하거나 대체하여 오류를 복구할 수 있습니다.
  • 해결 방법: , , , 또는 연산자를 사용하여 오류를 처리하고 잠재적으로 복구하거나 대체 값을 제공합니다.catchError catchErrorJustReturn retryWhenrecover
import RxSwift



let networkRequestObservable = Observable<String>.create { observer in

  // Simulate a network request that might fail

  if Random.shared.nextBool() {

    observer.onNext("Success!")

  } else {

    observer.onError(NSError(domain: "NetworkError", code: 101, userInfo: nil))

  }

}



networkRequestObservable

  .catchErrorJustReturn("Network error occurred")

  .subscribe(onNext: { result in

    print(result)

  }, onError: { error in

    print("Error: \(error.localizedDescription)")

  })

 

  • 설명:

networkRequestObservable성공하거나 실패할 수 있는 네트워크 요청을 시뮬레이션합니다.
catchErrorJustReturn오류를 포착하고 방출합니다