Behavior Subject

이숭인·2021년 6월 30일
0

Mastering RxSwift

목록 보기
7/7

Behavior Subject란?

  • Publish Subject와 유사한 방식으로 동작하고, Subject로 전달된 이벤트를 Observer에 전달하는것은 동일하다.

  • Subject를 생성하는 방식에서 차이가 존재한다.

아래 코드와 실행 결과를 통해 알아보자 !

let p = PublishSubject<Int>()

p.subscribe{ print("PublishSubject >>", $0) }
    .disposed(by: disposeBag)

let b = BehaviorSubject<Int>(value: 0)

b.subscribe{ print("BehaviorSubject >>", $0) }
    .disposed(by: disposeBag)
//b subject를 생성하면 내부에 next이벤트가 만들어짐 -> 생성자로 전달한 값이 저장됨
// 이 서브젝트를 구독하면 저장되어 있는 이벤트가 구독자한테 바로 전달됨. PublishSubject와의 차이점.

b.onNext(1)

b.subscribe{ print("BehaviorSubject >>2", $0) }
    .disposed(by: disposeBag)

//b.onCompleted()
b.onError(MyError.error)

b.subscribe{ print("BehaviorSubject >>3", $0) }
    .disposed(by: disposeBag)

이전에 공부했던

PublishSubject같은 경우, 새로 생성되었을때 아무 이벤트가 존재하지 않아서 subcribe를 하더라도 Observer가 아무런 이벤트도 받지 못한 반면,

BehaviorSubject는 처음 생성될 때 하나의 next이벤트를 가지고 있고, 인자로 next이벤트가 가지고 있을 값을 전달받는다.

때문에 subject를 생성하고 subcribe를 통해 Observer가 구독을 시작하는 경우, 생성될 때 가지고 있었던 next이벤트를 전달받는다.

  • 만약 subject가 생성되고 Observer에게 구독이 되기 전까지 이벤트가 여러번 발생하게 된다면, 아래 사진과 같이 Observer를 구독하는 시점에 Observer는 가장 마지막에 받았던 이벤트만 전달받게 된다.
let b = BehaviorSubject<Int>(value: 0)

b.onNext(1)
b.onNext(2)
b.onNext(3)

b.subscribe{ print("BehaviorSubject >>2", $0) }
    .disposed(by: disposeBag)

요약하자면..

  • PublishSubject와 거의 유사하지만, 초기 생성될 시점에 하나의 이벤트를 가지고 있는 것이 그 차이다.

  • subject가 구독되기 전 여러 이벤트를 전달받게 되더라도 구독되는 시점에 Observer에게는 가장 최근에 받았던 이벤트만 전달해준다.

profile
iOS Developer

0개의 댓글