RxSwift에서 Subject의 중요한 특징 중 하나가 바로 ‘**멀티캐스트’**와 ‘**발행 및 구독이 모두 가능하다’**입니다. 멀티 캐스란 한번의 발행으로 여러 관찰자에게 동시에 값을 공유하는 기법입니다. 즉, 아무리 관찰자가 많더라도 하나의 이벤트에 하나의 방출만 발생합니다. 또한, subject는 스트림의 발행이 가능합니다.
이와 대비하여, Observable은 **‘유니캐스트’**이며, **‘오직 구독만 가능하다’**는 특징이 있습니다. 유니캐스트는 발행자와 구독자가 1:1로 매핑되어 구독하고 있는 모든 구독자에게 이벤트를 방출해야합니다.
아래의 코드를 보면, Int 타입의 Observable을 하나 생성하고 이를 2곳에서 구독합니다.
class ViewController: UIViewController {
var bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
bind()
}
func bind() {
var observable = Observable.just(1).debug("observable emit")
// 구독자 1
observable
.subscribe(with: self) { owner, value in }
.disposed(by: bag)
// 구독자 2
observable
.scan(1) { a, _ in
return a + 1
}
.subscribe(with: self) { owner, cnt in }
.disposed(by: bag)
}
}
이때 debug 연산자를 통해 확인한 로그는 아래와 같습니다. 구독한 만큼 이벤트가 방출되고 있습니다. 이에 대한 더욱 자세한 설명은 토미님의 블로그를 참고해주세요.
2024-08-01 00:22:49.305: observable emit -> subscribed
2024-08-01 00:22:49.308: observable emit -> Event next(100)
2024-08-01 00:22:49.308: observable emit -> Event completed
2024-08-01 00:22:49.308: observable emit -> isDisposed
2024-08-01 00:22:49.309: observable emit -> subscribed
2024-08-01 00:22:49.309: observable emit -> Event next(100)
2024-08-01 00:22:49.309: observable emit -> Event completed
2024-08-01 00:22:49.309: observable emit -> isDisposed