점진적 과부하 개발 블로그

RxSwift Subject 알아보기 본문

RxSwift

RxSwift Subject 알아보기

지용빡 2022. 5. 16. 23:53
반응형
RxSwift Subject 알아보기
Subject
  • Observable이자 Observer
Subject의 종류
  • PublishSubject
    • 빈 상태로 시작하여 새로운 값만을 subscriber에 방출한다.
  • BehaviorSubject
    • 하나의 초기값을 가진 상태로 시작하여, 새로운 subscriber에게 초기값 또는 최신값을 방출한다.
  • ReplaySubject
    • 버퍼를 두고 초기화하며, 버퍼 사이즈 만큼의 값들을 유지하면서 새로운 subscriber에게 방출한다.
PublishSubject
  • 구독된 순간 새로운 이벤트 수신을 알리고 싶을 때 유용하다.
  • 아래로 향하는 화살표는 구독을 의미하고 위로 향하는 화살표는 방출을 의미한다. 

import RxSwift

let disposedBag = DisposeBag()

print("------PublishSubject------")
let publishSubject = PublishSubject<String>()

publishSubject.onNext("1안뇽하세요~")

let 구독자1 = publishSubject.subscribe(onNext: {
    print("첫번째 구독자 : \($0)")
})

publishSubject.onNext("2Do you hear me?")
publishSubject.on(.next("3Nope"))

구독자1.dispose()

let 구독자2 = publishSubject
    .subscribe(onNext: {
        print("두번째 구독자 : \($0)")
    })

publishSubject.onNext("4모시모시")
publishSubject.onCompleted()

publishSubject.onNext("5??")

구독자2.dispose()

publishSubject
    .subscribe {
        print("세번째 구독:", $0.element ?? $0)
    }
    .disposed(by: disposedBag)

publishSubject.onNext("6이거가능?")
BehaviorSubject 
  • 마지막 Next 이벤트를 새로운 구독자에게 반복하는 점만 빼면 PublishSubject와 유사하다.
  • 첫번째 줄이 BehaviorSubject이고 아래는 구독자들이다.
  • 직전의 값들을 항상 받는다.

print("----behaviorSubject----")
enum SubjectError: Error {
    case error1
}
// 반드시 초기값을 가진다.
let behaviorSubject = BehaviorSubject<String>(value: "초기값")

behaviorSubject.onNext("1. 첫번째값")

behaviorSubject.subscribe {
    print("첫번째 구독 :", $0.element ?? $0)
}
.disposed(by: disposedBag)

behaviorSubject.onError(SubjectError.error1)

behaviorSubject.subscribe {
    print("두번째 구독", $0.element ?? $0)
}
.disposed(by: disposedBag)
ReplaySubject 
  • 서브젝트를 생성할 때 선택한 특정크기까지 방출하는 최신요소를 일시적으로 버퍼로 둔다.
  • 구독자가 생길때 마다 방출을 한다.
  • 버퍼를 가지고 있게하는건 좋지만 너무 큰 형태의 버퍼를 가지는건 좋지않다. 

print("-----ReplaySubject-----")
let replaySubject = ReplaySubject<String>.create(bufferSize: 2) // 몇개의 버퍼를 가질것인지 선언

replaySubject.onNext("1 이게")
replaySubject.onNext("2 ReplaySubject")
replaySubject.onNext("3 인가요?")

replaySubject.subscribe {
    print("첫번째 구독 :", $0.element ?? $0)
}
.disposed(by: disposedBag)

replaySubject.subscribe {
    print("두번째 구독", $0.element ?? $0)
}
.disposed(by: disposedBag)

replaySubject.onNext("4 신기하네요")
replaySubject.onError(SubjectError.error1)
replaySubject.dispose()

replaySubject.subscribe {
    print("세번째 구독자", $0.element ?? $0)
}
.disposed(by: disposedBag)

 

반응형

'RxSwift' 카테고리의 다른 글

RxSwift Transforming Operator  (0) 2022.05.18
RxSwift Filtering Operator  (0) 2022.05.17
RxSwift Single, Maybe, Completable 알아보기  (0) 2022.05.15
RxSwift Observable 알아보기  (0) 2022.05.12
RxSwift 설치하기  (0) 2022.05.11