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 |