Post

BehaviorRelay 가 subscribe사용이 가능한 이유

BehaviorRelay 가 subscribe사용이 가능한 이유

BehaviorRelay는 내부적으로 BehaviorSubject를 감싸고 있기 때문이다.

  • BehaviorRelay는 Relay 타입이지만, 내부적으로 BehaviorSubject를 사용하여 동작
  • BehaviorSubject는 Observable 프로토콜을 준수하므로, subscribe를 사용 가능

즉, BehaviorRelay 자체가 Observable을 래핑한 형태이기 때문에 구독(subscribe) 가능

내부 구조

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public final class BehaviorRelay<Element>: ObservableType {
    private let subject: BehaviorSubject<Element>
    
    public var value: Element {
        return try! subject.value()
    }
    
    public init(value: Element) {
        subject = BehaviorSubject(value: value)
    }

    public func accept(_ event: Element) {
        subject.onNext(event)
    }

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

  • BehaviorRelay 내부에 BehaviorSubject (subject)가 있음
  • subscribe를 호출하면 내부적으로 BehaviorSubjectsubscribe를 실행
  • 즉, BehaviorRelay 자체가 ObservableType을 준수하기 때문에 구독 가능

예제 코드 - Subscribe 사용

1
2
3
4
5
6
7
8
9
10
11
12
13
import RxSwift
import RxRelay

let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: "초기값")

// 구독 (내부적으로 BehaviorSubject의 subscribe 호출)
relay.subscribe { print("구독된 값: \($0)") }
    .disposed(by: disposeBag)

// 새로운 값 전달
relay.accept("새로운 값")

This post is licensed under CC BY 4.0 by the author.