Tunko Development Diary

RxSwift) PublishSubject 란? 본문

Development/RxSwift

RxSwift) PublishSubject 란?

Tunko 2022. 5. 30. 14:14

ReactiveX - Subject

PublishSubject의 가장큰 특징은 옵저버의 구독 이후에 이벤트를 받을 수 있습니다.

let disposeBag = DisposeBag()
enum PublishSubjectError: Error {
   case error
}

// String타입을 받는 PublishSubject 생성
let subject = PublishSubject<String>()
subject.onNext("구독전")

먼저 subject는 옵저버와 옵저버블의 기능을 동시에 가지고 있습니다. 그래서 이벤트를 넘겨줄수 있습니다.

위 코드처럼 구독전에 subject에서 onNext 이벤트를 넘기면 아무런 이벤트도 받을 수 없습니다.

이후에 구독 코드를 추가해 줍니다.

let subject = PublishSubject<String>()
subject.onNext("구독전")
let o1 = subject.subscribe { print("o1 subject evnet : \\($0)")}
o1.disposed(by: disposeBag)
subject.onNext("구독후")

출력

o1 subject evnet : next(구독후)

정리하자면 o1 옵저버블이 구독을 하기전에 받은 onNext 이벤트는 무시됩니다. 구독 후에 받은 onNext 이벤트를 받을 수 있습니다.

두번째 예시입니다.

let subject = PublishSubject<String>()
subject.onNext("구독전")
let o1 = subject.subscribe { print("subject evnet : \\($0)")}
o1.disposed(by: disposeBag)
subject.onNext("구독후")
let o2 = subject.subscribe { print("o2 subject evnet : \\($0)")}
o2.disposed(by: disposeBag)
subject.onNext("Next Event")

출력

subject evnet : next(구독후)
subject evnet : next(Next Event)
subject evnet : next(Next Event)

이렇게 출력됩니다. 위에 “구독후”가 출력된 이후에 o2 옵저버블이 새로 구독을 하게 됩니다.

그후 방출되는 onNext 이벤트는 o1, o2 두 옵저버블 모두 구독중이기 때문에 “next(Next Event)” 가 두번 출력됩니다.

마지막으로 Completed 나 Error 이벤트 이후 구독되는 옵저버블에 대해선 이벤트를 수신할 수 없습니다.

반응형

'Development > RxSwift' 카테고리의 다른 글

RxSwift) ReplaySubject 란?  (0) 2022.05.30
RxSwift) BehaviorSubject 란?  (0) 2022.05.30
Subject 란?  (0) 2022.05.30
RxSwift) Operators 란?  (0) 2022.05.30
RxSwift) Disposables 란?  (0) 2022.05.30
Comments