RxSwift – Observerble

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

에 발행했습니다
RXSWIFT(으)로 분류되었습니다

aaron님이 작성

아무것도 안해도 시간은 흐른다.

댓글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다