본문 바로가기

개발

RxSwift Share Operators

728x90

RxSwift 공유 연산자

RxSwift의 share연산자는 Observables의 구독 및 리소스 사용을 관리하는 강력한 도구입니다. 여러 구독자가 동일한 Observable 스트림을 수신하도록 하여 불필요한 리소스 중복 및 성능 오버헤드를 방지합니다. RxSwift에서 연산자 를 사용하는 방법에 대한 몇 가지 실제 예를 살펴보겠습니다.

1. 네트워크 요청 공유:

  • 문제: 여러 구독자가 동일한 API 응답에 관심이 있는 경우 동일한 데이터에 대해 중복된 네트워크 요청을 하지 않도록 하세요.
  • 해결책: 네트워크 요청 후에 Observable을 사용하여 단 하나의 구독만 실제 네트워크 요청을 트리거 하고 모든 후속 구독자가 동일한 스트림을 수신하도록 보장합니다.
import RxSwift

import Moya



let provider = MoyaProvider<MyAPI>()



let sharedNetworkRequestObservable = provider.rx.request(.getUser(id: 123))

  .mapJSON()

  .asObservable()

  .share()



let subscriber1 = sharedNetworkRequestObservable.subscribe(onNext: { user in

  print("Subscriber 1: User data - \(user)")

})



let subscriber2 = sharedNetworkRequestObservable.delay(subscriptionDelay: .seconds(2), scheduler: SerialDispatchQueueScheduler(qos: .background)).subscribe(onNext: { user in

  print("Subscriber 2: User data - \(user)")

})

 

2. 장기 실행 Observables 공유:

  • 문제: 타이머나 백그라운드 작업 등 장기간에 걸쳐 값을 방출하는 장기 실행 Observable의 리소스를 효율적으로 관리합니다 .
  • 해결책: 장기 실행되는 Observable이 한 번만 실행되고, 모든 구독자가 기본 작업을 복제하지 않고 동일한 스트림을 수신하도록 하는 데 사용됩니다 .
import RxSwift



let longRunningObservable = Observable.create { observer in

  // Perform a long-running task or simulation

  for i in 1...100 {

    Thread.sleep(forTimeInterval: 0.1)

    observer.onNext(i)

  }

  observer.onCompleted()

}



let sharedLongRunningObservable = longRunningObservable.share()



let subscriber1 = sharedLongRunningObservable.subscribe(onNext: { number in

  print("Subscriber 1: Progress - \(number)")

})



let subscriber2 = sharedLongRunningObservable.delay(subscriptionDelay: .seconds(2), scheduler: SerialDispatchQueueScheduler(qos: .background)).subscribe(onNext: { number in

  print("Subscriber 2: Progress - \(number)")

})

 

3. 상태 관리를 위한 주제 공유:

  • 문제: 이벤트 처리나 데이터 업데이트에 사용되는 Subject의 상태를 효율적으로 관리하여 모든 구독자가 최신 업데이트를 받을 수 있도록 보장합니다.
  • 해결책: Subject 뒤에 사용하여 단 하나의 구독만 Subject의 동작을 트리거 하고 모든 후속 구독자가 동일한 이벤트 또는 업데이트 스트림을 수신하도록 합니다.
import RxSwift



let sharedStateSubject = PublishSubject<String>()



sharedStateSubject.onNext("Initial state")



let subscriber1 = sharedStateSubject.subscribe(onNext: { state in

  print("Subscriber 1: State update - \(state)")

})



sharedStateSubject.onNext("Updated state")



let subscriber2 = sharedStateSubject.subscribe(onNext: { state in

  print("Subscriber 2: State update - \(state)")

})

 

4. 놓친 이벤트에 대한 재생 주제 공유:

  • 문제: ReplaySubject의 새로운 구독자가 이전에 발생한 이벤트를 수신하도록 허용하여 중요한 상태 업데이트를 놓치지 않도록 합니다.
  • 해결책: ReplaySubject 뒤에 사용하여 ReplaySubject의 이전에 발생한 이벤트 버퍼가 모든 구독자와 공유되도록 하고, 이를 통해 구독자는 놓친 이벤트를 따라잡을 수 있습니다.
import RxSwift



let sharedReplaySubject = ReplaySubject<String>(bufferSize: 3)



sharedReplaySubject.onNext("Initial state")

sharedReplaySubject.onNext("Updated state")



let subscriber1 = sharedReplaySubject.subscribe(onNext: { state in

  print("Subscriber 1: State update - \(state)")

})



sharedReplaySubject.onNext("Another update")



let subscriber2 = sharedReplaySubject.subscribe(onNext: { state in

  print("Subscriber 2: State updates - \(state)") // Receives all emitted events, including missed ones

})

 

 

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

RxSwift로 비밀번호 체크 로직 만들기  (0) 2024.07.09
RxSwift로 로그인 로직 만들기  (0) 2024.07.09
RxSwift Combining Operators  (0) 2024.07.09
RxSwift Transforming Operators  (0) 2024.07.09
RxSwift Filtering Operators  (0) 2024.07.09