RxRelay 개념 및 사용 이유

권승용(Eric)·2025년 1월 4일

TIL

목록 보기
29/38

RxRelay?

  • RxSwift를 의존하며, BehaviorSubject, PublishSubject, RelaySubject에 대한 간단한 래퍼를 제공하는 모듈이다.

Relay?

  • 일반적인 Subject는 onError, onCompletion 시 시퀀스가 종료된다.
  • Relay는 절대로 종료되지 않는 시퀀스이다. onError, onCompletion 이 없다. accept만 존재.

Relay를 사용하는 이유

  • UI에 데이터를 제공하는 시퀀스가 onError로 인해 종료되어 버리면 UI는 더이상 데이터를 제공받을 수 없다.
  • 따라서 Subject 사용 시에는 계속해서 제공되어야 할 시퀀스가 종료될 위험이 있었고, 우리는 종료되지 않는 Subject인 Relay를 사용해 UI에 안정적으로 데이터를 제공할 수 있다.

Relay의 구현

  • Relay는 Subject의 Wrapper이다.
  • 실제로 BehaviorRelay의 구현을 살펴보며 그것이 어떤 의미인지 알아보자.
import RxSwift

/// BehaviorRelay is a wrapper for `BehaviorSubject`.
///
/// Unlike `BehaviorSubject` it can't terminate with error or completed.
public final class BehaviorRelay<Element>: ObservableType {
    private let subject: BehaviorSubject<Element>

    /// Accepts `event` and emits it to subscribers
    public func accept(_ event: Element) {
        self.subject.onNext(event)
    }

    /// Current value of behavior subject
    public var value: Element {
        // this try! is ok because subject can't error out or be disposed
        return try! self.subject.value()
    }

    /// Initializes behavior relay with initial value.
    public init(value: Element) {
        self.subject = BehaviorSubject(value: value)
    }

    /// Subscribes observer
    public func subscribe<Observer: ObserverType>(_ observer: Observer) -> Disposable where Observer.Element == Element {
        self.subject.subscribe(observer)
    }

    /// - returns: Canonical interface for push style sequence
    public func asObservable() -> Observable<Element> {
        self.subject.asObservable()
    }
    
    /// Convert to an `Infallible`
    ///
    /// - returns: `Infallible<Element>`
    public func asInfallible() -> Infallible<Element> {
        asInfallible(onErrorFallbackTo: .empty())
    }
}
  • 구현을 살펴보면 정말로 Relay는 단지 Subject를 onNext만 사용할 수 있도록 감싼 객체임을 알 수 있다.
  • accept 메소드는 BehaviorSubject의 onNext를 수행한다.
  • 따라서 어렵게 생각할 필요 없음!

출처

https://github.com/ReactiveX/RxSwift/blob/main/RxRelay/BehaviorRelay.swift

profile
ios 개발자에용

0개의 댓글