본문 바로가기

개발

RXSwift의 요소

728x90

RxSwift는 비동기 프로그래밍과 스트림 관리를 간소화하는 Swift용 반응형 프로그래밍 라이브러리입니다. 세 가지 핵심 개념을 중심으로 구축되었습니다.

  1. Observables: 시간이 지남에 따라 변경되는 이벤트 스트림 또는 값 시퀀스를 나타냅니다. Observables는 구독자에게 데이터, 오류 또는 완료 신호 와 같은 항목을 방출합니다 .
  2. Observers: Observables를 구독하여 방출된 항목을 수신합니다. 수신된 항목을 처리하고, 오류를 처리하고, 완료 이벤트에 응답할 수 있습니다.
  3. Operators: Observable 스트림을 변환, 결합 및 조작하는 강력한 도구를 제공합니다. 이들은 복잡한 데이터 처리 파이프라인과 데이터 스트림에 대한 작업을 가능하게 합니다.

이 세 가지 요소는 함께 작동하여 RxSwift의 반응형 프로그래밍 모델의 기반을 형성합니다.

1. 데이터 스트림으로서의 관찰 가능:

  • 관찰 가능 항목은 정적 값이 아닌 이벤트 스트림으로 데이터를 나타냅니다 .
  • 시간이 지남에 따라 항목을 방출하여 지속적인 데이터 흐름과 업데이트가 가능합니다.
  • 이를 통해 비동기 작업을 보다 관리하기 쉽고 선언적인 방식으로 처리할 수 있습니다.

2. 데이터 소비자로서의 관찰자:

  • Observer는 Observables를 구독하여 방출된 항목을 수신하고 처리합니다.
  • 데이터, 오류, 완료 신호 등 다양한 유형의 항목을 처리할 수 있습니다 .
  • 관찰자는 데이터 스트림의 변경 및 업데이트에 대응하는 방법을 제공합니다.

3. 변환 도구로서의 연산자:

  • 연산자는 Observable 스트림을 변환, 결합, 조작하는 강력한 함수입니다 .
  • 그들은 복잡한 데이터 처리 파이프라인을 만드는 데 필요한 기본 요소를 제공합니다.
  • 연산자는 데이터 스트림의 필터링, 매핑, 결합, 스케줄링 작업을 지원합니다.

RxSwift의 3가지 핵심 요소가 상호 작용하는 방식:

  1. 데이터 흐름: Observable은 항목을 방출하고, 이 항목은 시스템을 통해 구독된 Observer에게 전달됩니다.
  2. 구독: Observer는 Observables를 구독하여 방출된 항목을 수신합니다.
  3. 변환: 연산자는 Observable에 적용되어 데이터 스트림을 변환하거나 결합합니다.
  4. 처리 및 반응: 관찰자는 수신된 항목을 처리하고, 오류를 처리하고, 완료 이벤트에 응답합니다.

Observables, Observers, Operators 상호 작용을 통해 RxSwift 비동기 데이터 스트림을 효과적으로 처리할 있어 반응형 대응형 애플리케이션을 구축하는 귀중한 도구가 됩니다.

 

 


Rxswift Observables 예제

다음은 RxSwift에서 Observables를 사용하여 비동기 작업과 데이터 스트림을 처리하는 방법에 대한 몇 가지 예입니다.

1. 간단한 Observable 만들기:

import RxSwift



let observable = Observable<Int>.just(10)



observable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 단일 값 10을 방출하는 Observable을 생성합니다.
  • 이 subscribe방법은 Observable에 Observer를 연결하여 수신된 숫자를 콘솔에 출력합니다.

2. 시퀀스에서 Observable 생성:

import RxSwift



let numbers = [1, 2, 3, 4, 5]



let observable = Observable.from(numbers)



observable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 숫자 배열에서 Observable을 생성합니다.
  • Observable은 배열의 각 숫자를 순차적으로 내보냅니다.
  • Observer는 수신된 각 숫자를 콘솔에 출력합니다.

3. 이벤트 스트림에서 Observable 생성:

import RxSwift



let subject = PublishSubject<String>()



subject.onNext("Hello")

subject.onNext("World!")

subject.onNext("RxSwift")



subject.subscribe(onNext: { message in

  print("Received message: \(message)")

})

 

  • 이 코드는 이벤트를 구독자에게 내보내는 Observable 유형인 PublishSubject를 생성합니다 .
  • 이 코드는 제목에 "Hello", "World! ", "RxSwift"라는 세 개의 메시지를 내보냅니다.
  • Observer는 수신된 각 메시지를 콘솔에 출력합니다.

4. 연산자를 사용하여 관찰 가능 항목을 변환:

import RxSwift



let numbersObservable = Observable.from([1, 2, 3, 4, 5])



let squaredNumbersObservable = numbersObservable

  .map { $0 * $0 }



squaredNumbersObservable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 숫자 배열에서 Observable을 생성합니다.
  • 그런 다음 map연산자를 사용하여 각 숫자를 제곱으로 변환합니다.
  • Observer는 제곱된 각 숫자를 콘솔에 출력합니다.

5. Observables을 다음과 결합 combineLatest:

import RxSwift



let usernameObservable = Observable.from(["Alice", "Bob", "Charlie"])

let greetingObservable = Observable.just("Hello, ")



let combinedObservable = Observable.combineLatest(usernameObservable, greetingObservable) { username, greeting in

  "\(greeting)\(username)!"

}



combinedObservable.subscribe(onNext: { greeting in

  print("Greeting: \(greeting)")

})

 

  • 이 코드는 두 개의 Observable을 생성합니다. 하나는 사용자 이름에 대한 것이고 다른 하나는 인사말 문구에 대한 것입니다.
  • 이 combineLatest연산자를 사용하여 두 개의 Observable을 결합하고 각각의 최신 값을 내보냅니다.
  • 결합된 Observable은 각 사용자 이름에 대한 인사말 메시지를 내보냅니다.
  • Observer는 각 인사말 메시지를 콘솔에 출력합니다.

예제는 RxSwift에서 Observables 기본 사용법을 보여줍니다. Observables 비동기 데이터 스트림을 처리하고 반응형 애플리케이션을 구축하는 강력하고 유연한 방법을 제공합니다.

 

Rxswift Observers 예제

다음은 RxSwift에서 Observer를 사용하여 Observable을 구독하고 방출된 항목을 처리하는 방법에 대한 몇 가지 예입니다.

1. Observable을 구독하려면 다음을 사용하세요 onNext.

import RxSwift



let observable = Observable<Int>.just(10)



observable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 단일 값 10을 방출하는 Observable을 생성합니다.
  • 이 subscribe방법은 Observable에 Observer를 연결하여 수신된 숫자를 콘솔에 출력합니다.

2. 다음을 사용하여 오류 처리 onError:

import RxSwift



let observable = Observable<Int>.create { observer in

  observer.on(.next(10))

  observer.on(.error(NSError(domain: "MyErrorDomain", code: 1, userInfo: nil)))

}



observable.subscribe(onNext: { number in

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

}, onError: { error in

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

})

 

  • 이 코드는 값 10을 방출한 다음 오류를 방출하는 Observable을 생성합니다.
  • 이 subscribe방법에는 onError오류 설명을 콘솔에 출력하는 클로저가 포함되어 있습니다.

3. 완료에 대한 응답 onCompleted:

import RxSwift



let observable = Observable<Int>.create { observer in

  observer.on(.next(10))

  observer.on(.next(20))

  observer.on(.next(30))

  observer.on(.completed)

}



observable.subscribe(onNext: { number in

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

}, onCompleted: {

  print("Observable completed")

})

 

  • 이 코드는 숫자 세 개를 내보내고 완료하는 Observable을 생성합니다.
  • 이 subscribe방법에는 onCompletedObservable이 완료되면 메시지를 출력하는 클로저가 포함되어 있습니다.

4. 관찰자 처리:

import RxSwift



let observable = Observable<Int>.just(10)



let disposable = observable.subscribe(onNext: { number in

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

})



// Later, when you no longer need the Observer, dispose of it:

disposable.dispose()

 

  • 이 코드는 Observable을 생성하고 .을 사용하여 이를 구독합니다 subscribe.
  • 변수 disposable는 구독을 저장합니다.
  • 나중에 해당 메서드는 Observable의 구독을 취소하고 모든 리소스를 해제하기 dispose()위해 호출됩니다 .disposable

5. subscribe(on:)스케줄러 사용 observe(on:):

import RxSwift



let backgroundScheduler = SerialDispatchQueueScheduler(qos: .background)

let mainScheduler = DispatchQueue.main.scheduler



let observable = Observable<Int>.create { observer in

  backgroundScheduler.schedule {

    observer.on(.next(10))

    observer.on(.next(20))

    observer.on(.next(30))

  }

}



observable

  .subscribe(on: backgroundScheduler)

  .observe(on: mainScheduler)

  .subscribe(onNext: { number in

    print("Received number on main thread: \(number)")

  })

 

  • 이 코드는 백그라운드 스케줄러에서 Observable을 생성하고 메인 스레드에서 이를 구독합니다.
  • 스케줄러 subscribe(on:)는 Observable의 작업이 백그라운드 스케줄러에서 수행되도록 보장합니다.
  • 스케줄러 는 클로저가 메인 스레드에서 실행되도록 observe(on:)합니다 .onNext

예제는 RxSwift에서 Observer 기본 사용법을 보여줍니다. Observer Observable에서 방출된 항목을 수신하고 처리하는 방법을 제공 하여 반응형 대응형 애플리케이션을 빌드할 있습니다.

 

Rxswift Operators 예제

RxSwift는 Observable 스트림을 변환, 결합 및 조작 할 수 있는 풍부한 연산자 세트를 제공합니다 . 다음은 일반적으로 사용되는 RxSwift 연산자의 몇 가지 예입니다.

1. 필터링 연산자:

  • filter: 조건 폐쇄를 기반으로 Observable에서 방출되는 항목을 필터링합니다.
import RxSwift



let numbersObservable = Observable.from([1, 2, 3, 4, 5])



let evenNumbersObservable = numbersObservable

  .filter { $0 % 2 == 0 }



evenNumbersObservable.subscribe(onNext: { number in

  print("Even number: \(number)")

})

 

  • 이 코드는 numbersObservable짝수만 출력하도록 필터링합니다.

2. 변환 연산자:

  • map: 클로저를 사용하여 Observable에서 방출되는 각 항목을 변환합니다.
import RxSwift



let numbersObservable = Observable.from([1, 2, 3, 4, 5])



let squaredNumbersObservable = numbersObservable

  .map { $0 * $0 }



squaredNumbersObservable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 numbersObservable각 숫자를 제곱하여 변환합니다.
  • flatMap: 여러 Observable을 하나의 Observable로 평면화합니다.
import RxSwift



let numbersObservable = Observable.from([1, 2, 3])



let squaredNumbersObservable = numbersObservable

  .flatMap { number in

    Observable.just(number * number)

  }



squaredNumbersObservable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 numbersObservable각 숫자에 대해 새로운 Observable을 생성하고 해당 제곱을 방출하여 숫자를 평면화합니다.

3. 연산자 결합:

  • combineLatest: 여러 Observable에서 가장 최근에 방출된 항목을 하나의 Observable로 결합합니다.
import RxSwift



let usernameObservable = Observable.from(["Alice", "Bob", "Charlie"])

let greetingObservable = Observable.just("Hello, ")



let combinedObservable = Observable.combineLatest(usernameObservable, greetingObservable) { username, greeting in

  "\(greeting)\(username)!"

}



combinedObservable.subscribe(onNext: { greeting in

  print("Greeting: \(greeting)")

})

 

  • 이 코드는 usernameObservable과 을 결합하여 greetingObservable각 사용자 이름에 대한 인사말 메시지를 내보냅니다.
  • merge: 여러 개의 Observable을 하나의 Observable로 병합하고 각 Observable에서 항목을 동시에 방출합니다.
import RxSwift



let numbersObservable1 = Observable.from([1, 2, 3])

let numbersObservable2 = Observable.from([4, 5, 6])



let mergedObservable = Observable.merge(numbersObservable1, numbersObservable2)



mergedObservable.subscribe(onNext: { number in

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

})

 

  • 이 코드는 numbersObservable1와 를 병합 numbersObservable2하여 두 Observable에서 모든 숫자를 방출합니다.

4. 스케줄러:

  • subscribe(on:): 특정 스케줄러에서 Observable의 작업을 예약합니다.
import RxSwift



let backgroundScheduler = SerialDispatchQueueScheduler(qos: .background)

let mainScheduler = DispatchQueue.main.scheduler



let observable = Observable<Int>.create { observer in

  backgroundScheduler.schedule {

    observer.on(.next(10))

    observer.on(.next(20))

    observer.on(.next(30))

  }

}



observable

  .subscribe(on: backgroundScheduler)

  .observe(on: mainScheduler)

  .subscribe(onNext: { number in

    print("Received number on main thread: \(number)")

  })

 

  • 이 코드는 Observable의 작업이 백그라운드 스케줄러에서 수행되고 클로저 onNext가 메인 스레드에서 실행되도록 보장합니다.
  • observe(on:): Observer의 작업을 특정 스케줄러에 맞춰 예약합니다.

예제는 RxSwift 연산자의 기본 사용법을 보여줍니다. 연산자는 복잡한 데이터 처리 파이프라인을 구축하고 비동기 작업을 효과적으로 처리하는 강력한 도구를 제공합니다.

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

RxSwift Subjects  (0) 2024.07.09
RxSwift Observables  (0) 2024.07.09
RxSwift의 개념  (0) 2024.07.09
Combine ObservableObject  (0) 2024.07.08
Combine Publisher - Scheduler  (0) 2024.07.08