1. Relay

Subject의 Wrapper 클래스로, 절대 종료 이벤트로 인해 종료되지 않습니다.

엥 무슨 소리지.. 일단 Relay의 내부코드를 살펴보자

public final class PublishRelay<Element>: ObservableType {
    private let subject: PublishSubject<Element>
    
    // Accepts `event` and emits it to subscribers
    public func accept(_ event: Element) {
        self.subject.onNext(event)
    }
    
    /// Initializes with internal empty subject.
    public init() {
        self.subject = PublishSubject()
    }

    /// 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())
    }
}

보는 것과 같이 subject의 속성을 거의 따라하고 있습니다.

Q. 그렇다면 왜 Relay를 사용해야 될까?

핵심은 Relay의 경우 terminate 이벤트인 .completed, .error 이벤트를 발생시킬 수 없다.

→ 즉 dispose 전에는 절대 종료할 수 없다는 뜻

→ 계속 살아있는 스트림이기 때문에, UI Event와 바인딩하여 사용하기에 적합하다!

2. Relay의 종류

Subject의 Wrapper 클래스가 Relay인것처럼, 아래 해당되는 Relay들도 각각의 subject의 특성과 다르지 않다. 예시 코드는 딱히 첨부하지 않고 개념만 간단히 설명하도록 하겠다.

2-1. PublishRelay

PublishSubject의 Wrapper 클래스.

2-2. BehaviorRelay

BehaviorSubject의 Wrapper 클래스.