Subject는 observable과 observer의 역할을 모두 할 수 있는 bridge/proxy Observable이라 생각하면 됩니다. 그렇기 때문에 Observable이나 Subject 모두 Subscribe를 할 수 있습니다. 다만 subscribe의 차이가 있다면 Subject는 multicast방식이기 때문에 여러개의 observer를 subscribe할 수 있습니다. 단순 observable은 unicast방식이기 때문에 observer하나만을 subscribe할 수 있습니다.
PublishSubject
- 초기값이 없다
- subscriber는 subscribe한 시점 이 후에 발생되는 이벤트만 전달 받는다
- error가 발생하면 이 후 이벤트는 방출하지 않는다.
let subject = PublishSubject<String>()
subject.subscribe(onNext: { value in
print(value)
}.disposed(by:dosposeBag)
subject.onNext("Hello")
Hello
BehaviorSubject
- 초기값을 설정할 수 있다.
- subscriber는 subscribe 한 시점 이 후 부터 발생되는 이벤트만 전달 받는다.
- error 가 발생하면 이 후 이벤트는 방출 하지 않는다
let behavior = BehaviorSubject<String>(value: "초기값")
behavior.subscribe(onNext: {value in
print(value)
}).disposed(by: rx.disposeBag)
behavior.onNext("다음값")
초기값
다음값
ReplaySubject
지정된 버퍼사이즈만큼 마지막 값을 방출한다.
let replay = ReplaySubject<String>.create(bufferSize: 2)
replay.onNext("1")
replay.onNext("2")
replay.onNext("3")
replay.subscribe(onNext: { value in
print(value)
}).disposed(by: disposeBag)
//로그
2
3
BehaviorRelay
- RxCocoa 에 포함된 BehaviorSubject를 랩핑한것으로 UI에 적합
- onNext 가 아니라 accept 로 구동
- value 는 real only
- error, competed 가 없음
let behaviorRelay = BehaviorRelay<String?>(value: nil)
behaviorRelay
.filter { $0 != nil }
.map { $0! }
.subscribe(onNext: { value in
}).disposed(by: disposeBag)
behaviorRelay.accept("100")
//로그
100